欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java8新特性-日期时间类

程序员文章站 2022-10-03 17:46:58
**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

相关标签: jdk java 后端