介绍Java8新的日期时间库用法。由于Java之前旧的日期时间类太难用,所以Java8重新开发了新的日历时间库java.time。主要包含LocalDate本地日期类、LocalTime本地时间类、LocalDateTime日期时间类、ZonedDateTime带时区的日期时间类、Clock系统闹钟类、Instant类等。
常见用法
由于用法非常简单,直接上代码了,就只添加简单的注释,不作过多说明了(能用代码说明的就尽量不用注释)。
获取本地日期
LocalDate today = LocalDate.now();
System.out.println(today);//输出当前日期,比如2018-03-13
vs旧版本
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
显然新的库使用更加简洁。
转换日期格式
有时候我们并不想要输出yyyy-MM-dd的格式,而是想要输出其他格式,比如yyyy/MM/dd格式
这个时候可以使用DateTimeFormatter类来转换格式。
LocalDate today = LocalDate.now();
System.out.println("LocalDate now is:" + today.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));//输出2018/03/13
分别获取年、月、日
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year: %d Month: %d Day: %d
",year,month,day);
//输出Year: 2018 Month: 03 Day: 13
而以前还需要使用Calendar类来帮忙,繁琐且可读性差。
返回指定的某个日期
LocalDate specifiedDate = LocalDate.of(2018,3,13);
System.out.println("指定日期:" + specifiedDate);//输出2018-03-13
返回当前月份共有几天
int lengthOfMonth = today.lengthOfMonth();
System.out.printf("该月有%d天
",lengthOfMonth);//根据月份输出,比如31
获取星期几
DayOfWeek dayOfWeek = today.getDayOfWeek();
System.out.println(dayOfWeek);//输出MONDAY、TUESDAY、WEDNESDAY...
比较两个日期
LocalDate today2 = LocalDate.of(2018,3,12);
if(today.equals(today2)){
System.out.println("today equals today2");
}
if(today.isBefore(today2)){
System.out.println(today + "早于" + today2);
}
if(today2.isAfter(today)){
System.out.println(today + "晚于" + today2);
}
日期计算
LocalDate tomorrow = today.plusDays(1);
LocalDate preWeekDate = today.minusWeeks(1);
LocalDate nextMonthDate = today.plusMonths(1);
System.out.println("明天日期:" + tomorrow);
System.out.println("上一周日期:" + preWeekDate);
System.out.println("下个月日期:" + nextMonthDate);
日期、时间计算:往前就minusXXX、往后就plusXXX
获取当前时间
//默认格式HH:mm:ss.nnn 带毫秒
LocalTime time = LocalTime.now().withNano(0); //将毫秒取值0
System.out.println("LocalTime now is:" + time);
我们一般使用只需要到秒的话,就使用withNano(0)方法将毫秒取值0,即可输出HH:mm:ss格式。同理,其他还有withHour()、withMinute()、withSecond()方法用来直接修改时、分、秒。
获取当前日期时间
//默认格式yyyy-MM-dd HH:mm:SS.nnn 可使用DateTimeFormatter转换格式
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("转换后的日期时间格式:" + dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:SS")));
返回指定的某个时间
LocalTime specifiedTime = LocalTime.of(15,40,30);
System.out.println("指定时间:" + specifiedTime);//输出15:40:30
带时区的完整时间
ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt);//输出2018-03-13T14:36:11.425+08:00[Asia/Shanghai]
获取时间戳
Instant timestamp = Instant.now();
System.out.println(timestamp);//输出2018-03-13T06:36:11.425Z
long currentTimeMillis = Clock.systemUTC().millis();
System.out.println(currentTimeMillis);//输出1520922971426,相当于System.currentTimeMillis()方法
总结
比较常用的方法就这些了,后续有遇到新的问题再补充。建议大家在新的项目中最好就用新的日期时间库中的类,会方便很多。而对于那些历史遗留项目,就只能继续入坑了,除非你改用JDK 1.8的。