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优雅的处理日期时间