简介:旧的java版本中,我们经常使用java.util.Date包来处理日期,使用起来繁琐,功能也不是非常的强大,线程不安全。随着Java 8的发布,新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理,弥补了之前版本的弊端。很多新的 API类放在了java.time 包下,重要的api有:
LocalDate ,LocalDateTime,LocalTime,ZonedDateTime,ZoneId,ZoneOffset等
优点:
- 类是不可变的
- 线程安全的
- 处理跨时区方便
示例代码:
public class DateTimeTest {
public static void main(String[] args) {
DateTimeTest.testLocalDateTime();
DateTimeTest.testZonedDateTime();
}
//本地化日期时间
public static void testLocalDateTime(){
//获取当前日期的时间
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:"+now);
LocalDate localDate = now.toLocalDate();
System.out.println("日期:"+localDate);
LocalTime localTime = now.toLocalTime();
System.out.println("时分秒毫秒:"+localTime);
int year = now.getYear();
int month = now.getMonth().getValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("年:"+year+",月:"+month+",日:"+day+",时:"+hour+",分:"+minute+",秒:"+second);
LocalDateTime withYear = now.withDayOfMonth(10).withYear(2020);
System.out.println("修改年,日期: " + withYear);
LocalDate localDate2 = LocalDate.of(2020, Month.DECEMBER, 12);
System.out.println("设置年月日:"+localDate2);
LocalDate parse = LocalDate.parse("2020-01-06");
System.out.println("解析年月日:"+parse);
LocalTime of = LocalTime.of(20,5, 30);
System.out.println("设置时分秒:"+of);
LocalTime parse2 = LocalTime.parse("20:15:30");
System.out.println("解析时分秒:"+parse2);
}
//使用时区的日期时间API
public static void testZonedDateTime(){
ZonedDateTime parse = ZonedDateTime.parse("2019-12-03T10:15:30+05:00[Asia/Shanghai]");
System.out.println("时间:"+parse);
ZoneId of = ZoneId.of("Z");
System.out.println("ZoneId:"+of);
ZoneId systemDefault = ZoneId.systemDefault();
System.out.println("当期时区: " + systemDefault);
LocalDateTime ldt1 = LocalDateTime.now(systemDefault);
System.out.println("本地化日期时间: " + ldt1);
ZonedDateTime atZone = ldt1.atZone(systemDefault);
System.out.println("时区格式显示时间:"+atZone);
System.out.println("格林威治时间:"+LocalDateTime.now(of));
//可以获取所有时区时区信息
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
availableZoneIds.stream().forEach( s ->System.err.println(s));
}
}
结果: