Joda-Time优雅的处理日期时间

Joda-Time优雅的处理日期时间 一、简介 Java 8中的java.time包中提供的API和Joda-Time并不完全相同。比如,在Joda-Time中常用的Interval(用来表示一对DateTime),在JSR 310中并不支持。因此,另一个名叫Threeten的第三方库用来弥补Jav

Joda-Time优雅的处理日期时间

一、简介

Java 8中的java.time包中提供的API和Joda-Time并不完全相同。比如,在Joda-Time中常用的Interval(用来表示一对DateTime),在JSR 310中并不支持。因此,另一个名叫Threeten的第三方库用来弥补Java 8的不足。

joda-time是一个常用的时间处理类库,它提供了如下几个常用的类:

  • Instant:用来表示时间轴上一个瞬时的点
  • DateTime:用来替换JDK的Calendar类
  • LocalDate:表示一个本地的日期,而不包含时间部分(没有时区信息)
  • LocalTime:表示一个本地的时间,而不包含日期部分(没有时区信息)
  • LocalDateTime:表示一个本地的日期-时间(没有时区信息)

注意:不可变的类,表明了正如Java的String类型一样,其对象是不可变的。不论对它进行怎样的改变操作,返回的对象都是新对象。
maven依赖

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.10</version>
</dependency>

二、核心类介绍

2.1 DateTime类--构造指定时间类

DateTime():这个无参的构造方法会创建一个在当前系统所在时区的当前时间,精确到毫秒
DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute):这个构造方法方便快速地构造一个指定的时间,这里精确到秒,类似地其它构造方法也可以传入毫秒。
DateTime(long instant):这个构造方法创建出来的实例,是通过一个long类型的时间戳,它表示这个时间戳距1970-01-01T00:00:00Z的毫秒数。使用默认的时区。
DateTime(Object instant):这个构造方法可以通过一个Object对象构造一个实例。这个Object对象可以是这些类型:ReadableInstant, String, Calendar和Date。其中String的格式需要是ISO8601格式,

Time = new DateTime(2017,9,14,20,30,0);  
// 使用时间戳构造
Datetime dateTime = new DateTime(1505371053358L);
// 使用字符串构造,使用字符串构造需要自己定义pattern
String date = "2017-09-14 20:30:00";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = dateTimeFormatter.parseDateTime(date);
// 指定时区构造时间
DateTime dateTime = new DateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai")));

2.2 访问DateTime类--对时间类进行操作

2.2.1 with系列方法

with开头的方法(比如:withYear)用来设置DateTime实例到某个时间,因为DateTime是不可变对象,所以没有提供setter方法可供使用,with方法也没有改变原有的对象,而是返回了设置后的一个副本对象。

DateTime dateTime1 = new DateTime(2024,9,4,0,0,0);
DateTime dateTime2 = dateTime1.withYear(2026); //更改年份,生成一个新的对象 

2.2.2 plus/minus系列方法

plus/minus开头的方法(比如:plus*为加, minus*为减):用来返回在DateTime实例上增加或减少一段时间后的实例。在增减时间的时候,想象成自己在翻日历,所有的计算都将符合历法,由Joda-Time自动完成,不会出现非法的日期

DateTime now = new DateTime();
DateTime tomorrow = now.plusDays(1); //加一天
DateTime lastMonth = now.minusMonths(1);  //减一个月

2.2.3 返回Property方法

Property是DateTime中的属性,保存了一些有用的信息。Property对象中的一些方法在这里一并介绍。下面的例子展示了,我们可以通过不同Property中get开头的方法获取一些有用的信息:

DateTime now = new DateTime(); 
now.monthOfYear().getAsText(); // February
now.monthOfYear().getAsText(Locale.KOREAN); // 2월
now.dayOfWeek().getAsShortText(); // Fri
now.dayOfWeek().getAsShortText(Locale.CHINESE); // 星期五
  • DateTime的某些属性进行置0操作,Property中round开头的方法(roundFloorCopy)
DateTime now = new DateTime(); // 2016-02-26T16:51:28.749+08:00
now.dayOfWeek().roundCeilingCopy(); // 2016-02-27T00:00:00.000+08:00
now.dayOfWeek().roundFloorCopy(); // 2016-02-26T00:00:00.000+08:00
now.minuteOfDay().roundFloorCopy(); // 2016-02-26T16:51:00.000+08:00
now.secondOfMinute().roundFloorCopy(); // 2016-02-26T16:51:28.000+08:00

三、代码演示

public class DateTimeUtil {

  public boolean isWednesDay(){
    DateTime dateTime = new DateTime();
    // 今天是星期几
    int week = dateTime.getDayOfWeek();
    // 判断今天是不是星期三
    if(dateTime.getDayOfWeek() == DateTimeConstants.WEDNESDAY){
    	// TODO
    }
}

 /**
     * 判断是否是工作日
     * @return true:在工作日 false:不在工作日
     */
    public static boolean isWorkDay(DateTime dateTime){
        //获取工作日
        int weekNum = dateTime.dayOfWeek().get();
        return  weekNum>=1 && weekNum<=5;
    }

    /**
     * 获取上一天日期
     * @param dateTime
     * @return
     */
    public static DateTime getPreDateTime(DateTime dateTime){
        return dateTime.minusDays(1);
    }

    /**
     * 日期转String
     * @param dateTime 日期
     * @param pattern 日期正则格式
     * @return
     */
    public static String parseToString(DateTime dateTime,String pattern){
       return  dateTime.toString(DateTimeFormat.forPattern(pattern));
    }

}

更多操作可以阅读以下两篇文章:
Joda Time使用小结
使用Joda-Time优雅的处理日期时间

Comment