木叶飞舞之处,火亦生生不息
java8中定义了新的时间包java.time较于1.8之前的 Date,Calendar ,TimeZone,SimpleDateFormat有了更好的实现方式。
比如新的时间格式不管什么操作都是产生新实例,是线程安全的。
一、包的层级结构
- java.time:标准的日期和时间的类
- java.time.chrono:特殊的时间,比如日本的平成,*的民国
- java.time.format:时间格式化
- java.time.temporal:时间校正器
- java.time.zone:时区
二、常用方法示例
一、日期
一共有三个常用类LocalDate,LocalTime,LocalDateTime。
其中的方法都是见名知意,可以说是非常好用,下面仅做演示。
//表示日期的
LocalDate localDate = LocalDate.now();
System.out.println("当前日期:" + localDate);
//表示时间的
LocalTime localTime = LocalTime.now();
System.out.println("当前时间:" + localTime);
//表示日期加时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前日期时间:" + localDateTime);
//获取时间的每个值
System.out.println("年:" + localDateTime.getYear());
System.out.println("月:" + localDateTime.getMonthValue());
System.out.println("日:" + localDateTime.getDayOfMonth());
System.out.println("时:" + localDateTime.getHour());
System.out.println("分:" + localDateTime.getMinute());
System.out.println("秒:" + localDateTime.getSecond());
//指定时间的创建方式
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 12, 31, 23, 23, 23);
System.out.println("自定义日期时间:" + localDateTime1);
//增加两天
LocalDateTime localDateTime2 = localDateTime1.plusDays(2);
System.out.println("自定义日期时间+两天:" + localDateTime2);
其结果为
当前日期:2021-08-04
当前时间:17:05:15.793
当前日期时间:2021-08-04T17:05:15.793
年:2021
月:8
日:4
时:17
分:5
秒:15
自定义日期时间:2021-12-31T23:23:23
自定义日期时间+两天:2022-01-02T23:23:23
二、时间戳
时间戳就是从1970年1月1日0时0分0秒至今计算的毫秒数,使用Instant类。
//默认获取UTC时间 比东八区早8个小时
Instant instant = Instant.now();
System.out.println("默认时间:" + instant);
Instant now = Instant.now(Clock.systemUTC());
System.out.println("当前时区时间:" + instant);
System.out.println("当前时区毫秒:" + now.toEpochMilli());
System.out.println("当前时区秒:" + now.getEpochSecond());
其结果为
默认时间:2021-08-04T09:33:58.596Z
当前时区时间:2021-08-04T09:33:58.596Z
当前时区毫秒:1628069638641
当前时区秒:1628069638
三、获取时间范围
时间范围用Duration或者Period获取,两者的不同是Peirod只接收LocalDate类型的参数而Duration接收的参数要实现Temporal接口。所以Period只能精确到天,Duration能精确到毫秒甚至纳秒。
//时间之间间隔的
LocalDateTime localDateTime1 = LocalDateTime.now();
Thread.sleep(1000);
LocalDateTime localDateTime2 = LocalDateTime.now();
Duration duration = Duration.between(localDateTime1, localDateTime2);
System.out.println("获取毫秒数" + duration.toMillis());
//日期之间间隔的
LocalDate localDate1 = LocalDate.of(2021, 7, 8);
LocalDate localDate2 = LocalDate.of(2021, 7, 12);
Period period = Period.between(localDate1, localDate2);
System.out.println("获取天数" + period.getDays());
其结果为
获取毫秒数1009
获取天数4
四、时间校正器
在temporal包下,有一个类TemporalAdjusters提供了大量的静态方法去修改时间。
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前时间:" + localDateTime);
//指定天数到下周五
LocalDateTime localDateTime1 = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println("下周五:" + localDateTime1);
//指定哪一天
LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(10);
System.out.println("指定时间:" + localDateTime2);
LocalDateTime localDateTime3 = localDateTime.withDayOfYear(300);
System.out.println("指定时间:" + localDateTime3);
//自定义 下一个工作日
LocalDateTime localDateTime4 = localDateTime.with((l) -> {
LocalDateTime s2 = (LocalDateTime) l;
DayOfWeek dayOfWeek = s2.getDayOfWeek();
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return s2.plusDays(3);
} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return s2.plusDays(2);
} else {
return s2.plusDays(1);
}
});
System.out.println("下一个工作日:" + localDateTime4);
其结果为
当前时间:2021-08-04T19:25:11.288
下周五:2021-08-06T19:25:11.288
指定时间:2021-08-10T19:25:11.288
指定时间:2021-10-27T19:25:11.288
下一个工作日:2021-08-05T19:25:11.288
五、时间格式化
格式化使用DateTimeFormatter进行,既可以从DateTimeFormatter调用方法,也可以将该类的方法当做参数传入。
LocalDateTime now = LocalDateTime.now();
String str = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssSSS"));
String str1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now);
System.out.println(str);
System.out.println(str1);
//字符串转时间格式化毫秒值好像必须有. 暂不知道为什么
LocalDateTime localDateTime = LocalDateTime.parse("20210808121212.111", DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS"));
LocalDateTime localDateTime1 = LocalDateTime.from(DateTimeFormatter.ofPattern("yyyyMMddHHmmss").parse("20210808121212"));
System.out.println(localDateTime);
System.out.println(localDateTime1);
其结果为
2021-08-04 19:50:27102
2021-08-04 19:50:27
2021-08-08T12:12:12.111
2021-08-08T12:12:12