java8新特性-日期时间类
程序员文章站
2022-04-16 16:32:47
**java8新特性-日期时间类**在JDK1.8之前,日期和时间的处理一直是Java里面经常被吐槽的问题 JDK1.8推出了全新的日期时间API 。在JDK1.8中引入java.time.*包,重新定义了一套日期时间处理类, 让日期时间的处理变得简单易用1. java.time包简介java.time包主要提供了日期、时间、瞬间、持续时间的api主要的日期时间概念,包括时刻,持续时间,日期,时间,时区和时段。 基于ISO日历系统,所有的类都是不可变的,线程安全的按类型主要分为: 1....
在JDK1.8之前,日期和时间的处理一直是Java里面经常被吐槽的问题 JDK1.8推出了全新的日期时间API 。
在JDK1.8中引入java.time.*包,重新定义了一套日期时间处理类, 让日期时间的处理变得简单易用
1. java.time包简介
java.time包主要提供了日期、时间、瞬间、持续时间的api主要的日期时间概念,
包括时刻,持续时间,日期,时间,时区和时段。 基于ISO日历系统,所有的类都是不可变的,线程安全的
按类型主要分为:
1. 日期和时间
1)、Instant本质上是一个数字时间戳。
2)、LocalDate存储没有时间的日期,如2020-07-30
3)、 LocalTime 存储没有日期的时间,如11:24
4)、 LocalDateTime 存储日期和时间。如2020-07-30T10:25:45.969
5)、ZonedDateTime 存储带时区的日期和时间
2. 期限
1)、Duration 存储期间和持续时间。以纳秒为单位的时间线的简单测量
3. 附加的类型
1)、Month 存储一个月。如“十一月”
2)、DayOfWeek 存储一周中的一天,如“Tuesday”
3)、Year 存储年,如“2020”
4)、YearMonth 存储年和月,如“2020-10”,可用于信用卡上的到期
5)、MonthDay 存储月和日,如“12-14”,可用于存储生日
6)、OffsetTime 存储与UTC没有日期的时间和偏移量
7)、OffsetDateTime存储与UTC的日期时间和偏移量
注:UTC
协调世界时(Coordinated Universal Time)又称世界统一时间、世界标准时间,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
2.用法:
Instant
Instant表示的是时间线上的瞬间点,本质上就是时间戳
Instant instant = Instant.now();
//默认时间比北京时间相差8小时
System.out.println(instant);//2020-07-30T03:33:40.249Z
//设置时区后,显示正常时间
System.out.println(instant.atZone(ZoneId.systemDefault()));//2020-07-30T11:35:40.381+08:00[Asia/Shanghai]
//获取当前时间戳的秒数
System.out.println(instant.getEpochSecond());
//获取当前时间戳的毫秒
System.out.println(instant.toEpochMilli());
//Date类型转换为Instant
Instant instant1 = Instant.ofEpochMilli(new Date().getTime());
System.out.println(instant1);//2020-07-30T03:39:10.798Z
//将字符串转换成Instant
Instant instant2 = Instant.parse("2020-07-30T03:39:10.798Z");
System.out.println(instant2); //2020-07-30T03:39:10.798Z
//将Clock转换成Instant
//Clock.systemUTC() 使用UTC区域中最佳可用系统时钟的时钟,不为空。
Instant instant3 = Instant.now(Clock.systemUTC());
System.out.println(instant3);
//加5小时,注意加操作对instant对象本身来说没有影响
System.out.println(instant.plus(5, ChronoUnit.HOURS)); //2020-07-30T08:45:30.769Z
System.out.println(instant);//2020-07-30T03:45:30.769Z
Instant ins1 = Instant.parse("2020-07-30T11:52:56.053Z");
Instant ins2 = Instant.parse("2020-07-30T11:52:46.034Z");
//时间戳比较
System.out.println(ins1.isAfter(ins2));
System.out.println(ins1.isBefore(ins2));
LocalDate
LocalDate是一个不可变的日期时间对象,存储没有时间的日期
LocalDate localDate = LocalDate.now();
System.out.println(localDate); //2020-07-30
//Clock转换成LocalDate
LocalDate localDate1 = LocalDate.now(Clock.systemDefaultZone());
System.out.println(localDate1);//2020-07-30
////指定年月日的LocalDate
LocalDate localDate2 = LocalDate.of(2020, 7, 30);
System.out.println(localDate2);//2020-07-30
//字符串转换成LocalDate
LocalDate localDate3 = LocalDate.parse("2020-07-30");
System.out.println(localDate3);//2020-07-30
//指定格式化规则的转换
LocalDate localDate4 = LocalDate.parse("20200729", DateTimeFormatter.ofPattern("yyyyMMdd"));
System.out.println(localDate4);//2020-07-29
//2020年的第360天
LocalDate localDate5 = LocalDate.ofYearDay(2020, 360);
System.out.println(localDate5);//2020-12-25
//加5天
System.out.println(localDate.plusDays(5));//2020-08-04
System.out.println(localDate.plus(5, ChronoUnit.DAYS));//2020-08-04
//一周后
System.out.println(localDate.plusWeeks(1));//2020-08-06
System.out.println(localDate.plus(1,ChronoUnit.WEEKS));//2020-08-06
//一月后
System.out.println(localDate.plusMonths(1));//2020-08-30
//一年后
System.out.println(localDate.plusYears(1));//2021-07-30
//五天前
System.out.println(localDate.plusDays(-5));//2020-07-25
System.out.println(localDate.minusDays(5));//2020-07-25
//6天后是星期几
System.out.println(localDate.plusDays(6).getDayOfWeek());//WEDNESDAY
//localDate所代表的日期是当月的第几天
System.out.println(localDate.getDayOfMonth());//30
//localDate所代表的日期是今年的第多少天
System.out.println(localDate.getDayOfYear());//212
//日期格式化
System.out.println(localDate.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));//2020年07月30日
//明年是否闰年
System.out.println(localDate.plusYears(1).isLeapYear());//false
//今年是否是闰年
System.out.println(localDate.isLeapYear());//true
//当月有多少天
System.out.println(localDate.lengthOfMonth());//31
//当年有多少天
System.out.println(localDate.lengthOfYear());//366
LocalTime
LocalTime是一个不可变的日期时间对象,存储没有日期的时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime);//14:52:33.887
// 时:分
System.out.println(LocalTime.of(14,53));//14:53
//时:分:秒
System.out.println(LocalTime.of(14,54,45));//14:54:45
//加两小时
System.out.println(localTime.plusHours(2));//16:58:45.877
//LocalTime的很多方法和操作跟LocalDate都是一样的......
LocalDateTime
LocalDateTime是一个不可变的日期时间对象,代表日期时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);//2020-07-30T15:02:40.879
//日期时间格式化
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")));//2020-07-30 03:02:40
//20天后是星期几
System.out.println(localDateTime.plusDays(20).getDayOfWeek());//WEDNESDAY
//20分钟后
System.out.println(localDateTime.plusMinutes(20).format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")));//2020-07-30 03:24:28
//LocalDateTime相当于是结合了LocalDate和LocalTime,方法和功能也都是一样的
ZonedDateTime
ZonedDateTime是具有时区的日期时间的不可变表示
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);//2020-07-30T15:05:34.512+08:00[Asia/Shanghai]
System.out.println();
//转换成LocalDate
System.out.println(zonedDateTime.toLocalDate());//2020-07-30
//转换成LocalDateTime
System.out.println(zonedDateTime.toLocalDateTime());//2020-07-30T15:08:14.137
//转换成LocalTime
System.out.println(zonedDateTime.toLocalTime());//15:08:14.137
//加3天
System.out.println(zonedDateTime.plusDays(3));//2020-08-02T15:08:14.137+08:00[Asia/Shanghai]
//格式化
System.out.println(zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")));
//2020-07-30 03:08:14
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).format(zonedDateTime));
// 下午03时33分32秒 CST
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG).format(zonedDateTime));
// 下午03时33分32秒
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM).format(zonedDateTime));
// 15:33:32
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(zonedDateTime));
// 下午3:33
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(zonedDateTime));
// 2020年7月30日 星期四
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(zonedDateTime));
// 2020年7月30日
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(zonedDateTime));
// 2020-7-30
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(zonedDateTime));
// 20-7-30
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).format(zonedDateTime));
// 2020年7月30日 星期四 下午03时33分32秒 CST
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).format(zonedDateTime));
// 2020年7月30日 下午03时33分32秒
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(zonedDateTime));
// 2020-7-30 15:33:32
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).format(zonedDateTime));
// 20-7-30 下午3:33
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).format(zonedDateTime));
// 2020年7月30日 星期四 15:33:32
Duration
Duration描述的其实是时长,表示一个时间区间
Duration duration = Duration.of(10, ChronoUnit.DAYS);
System.out.println(duration);//PT240H
//5小时
System.out.println(Duration.ofHours(5));//PT5H
//输出小时
System.out.println(Duration.of(5,ChronoUnit.DAYS).toHours());//120
//加8小时(10天8小时)
System.out.println(duration.plusHours(8).toHours());//248
上面就是常用的日期时间类型的使用,基本上日常的使用通过上面的几个类就够用了,其他类型(Month、DayOfWeek、Year、YearMonth、MonthDay、OffsetTime、OffsetDateTime)的用法都是大同小异
本文地址:https://blog.csdn.net/weixin_45536675/article/details/107686043
推荐阅读
-
聊聊 Java8 以后各个版本的新特性
-
java8获取一个时间段内的所有年月日期
-
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java8 日期和时间API
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java8新特性Stream的完全使用指南
-
Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
-
Java8新特性Lambda表达式的一些复杂用法总结
-
函数式接口 + Lamda表达式推导过程(Java8 新特性)