Java8新特性之日期和时间

提示:本阅读大约需要10分钟


一、概述

Java 8 包含了全新的时间日期API,这些功能都放在了java.time包下。有以下几个优点:

  1. 为保证安全,所有class都不可变且不可继承(final),除abstract和interface以外。每一次方法调用都会产生新的日期时间实例,不影响之前的值。
  2. 为时区、日期、时间、日期时间、时间戳甚至年、月、日都定义了不同的类,功能分离明显。
  3. API调用具有链式风格,无论是静态方法还是类方法都有很明确的行为,方法名能表达其中意思。
  4. 功能全面,几乎所有日期时间类的API都提供加减(日期或时间)、格式化、解析等方法,且能互相转换,方便协作。
    在这里插入图片描述

在这里插入图片描述

二、代码示例

1.LocalDateTime 日期时间

代码如下(示例):


//日期格式化
LocalDateTime sylvester = LocalDateTime.of(2020, Month.DECEMBER,
                31, 23, 59, 59);
        System.out.println(sylvester);
		
        DayOfWeek dayOfWeek1 = sylvester.getDayOfWeek();
        System.out.println(dayOfWeek1);

        Month month = sylvester.getMonth();
        System.out.println(month);

        long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);
        System.out.println(minuteOfDay);

        //转成Date对象
        Instant instant1 = sylvester.atZone(ZoneId.systemDefault()).toInstant();
        System.out.println(Date.from(instant1));

        //格式化时间 yMd Hms
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss");
        String format = dateTimeFormatter.format(LocalDateTime.now());
        System.out.println(format);

2.LocalDate 日期

代码如下(示例):


   LocalDate today = LocalDate.now();
        System.out.println(today);
        //向后推一天
        LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
        System.out.println(tomorrow);
        //向后推两天
        LocalDate yesterday = today.minusDays(2);
        System.out.println(yesterday);
        //计算星期
        LocalDate independenceDay = LocalDate.of(2020, Month.DECEMBER, 28);
        DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
        System.out.println(dayOfWeek);

        DateTimeFormatter germanFormatter1 =
                DateTimeFormatter
                        .ofLocalizedDate(FormatStyle.MEDIUM)
                        .withLocale(Locale.GERMAN);
        LocalDate xmas = LocalDate.parse("12.12.2020", germanFormatter1);
        System.out.println(xmas);
        

3.LocalTime 本地时间

LocalTime是由多个工厂方法组成,其目的是为了简化对时间对象实例的创建和操 作,包括对时间字符串进行解析的操作。本地时间类表示一个没有指定时区的时间,例如,10 p.m.或者17:30:15,下面的 例子会用上面的例子定义的时区创建两个本地时间对象。然后我们会比较两个时间,并计算它们之间的小时和分钟的不同。
代码如下(示例):

    
        // 创建上海Asia/Shanghai和伦敦Europe/London的时区 测试LocalTime
        LocalTime now = LocalTime.now(ZoneId.of("Europe/London"));
        LocalTime now1 = LocalTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(now);
        System.out.println(now1);
        System.out.println(now1.isBefore(now));
        //计算两个时区的时间差
        long hoursBetween = ChronoUnit.HOURS.between(now, now1);
        System.out.println(hoursBetween);

        
        LocalTime of = LocalTime.of(12, 12, 12);
        System.out.println(of);
        DateTimeFormatter germanFormatter =
                DateTimeFormatter
                        .ofLocalizedTime(FormatStyle.SHORT)
                        .withLocale(Locale.GERMAN);
        LocalTime leetTime = LocalTime.parse("13:37", germanFormatter);
        System.out.println(leetTime);
        

4.Clock 时钟

Clock提供了对当前时间和日期的访问功能。Clock是对当前时区敏感的,并可用于 替代System.currentTimeMillis()方法来获取当前的毫秒时间。当前时间线上的时刻 可以用Instance类来表示。Instance也能够用于创建原先的java.util.Date对象。
代码如下(示例):

        
        //中国默认时区 Asia/Shanghai
        Clock clock = Clock.systemDefaultZone();
        System.out.println(clock);
        //现在距离1970年1月1日的毫秒时间
        long millis = clock.millis();
        System.out.println(millis);
        Instant instant = clock.instant();
        //年月日
        Date from = Date.from(instant);
        System.out.println(from);
        

5.Timezones 时区

时区类可以用一个ZoneId来表示。时区类的对象可以通过静态工厂方法方便地获 取。时区类还定义了一个偏移量,用来在当前时刻或某时间与目标时区时间之间进 行转换。
代码如下(示例):



        //默认时区
        System.out.println(ZoneId.systemDefault());
        //支持的所有时区
        System.out.println(ZoneId.getAvailableZoneIds());
        //当前的标准偏移量
        System.out.println(ZoneId.of("Asia/Shanghai").getRules());
        

三、总结

java8强大的日期时间库,省去了以前很多不必要的操作,如果正在开发的项目对时间很敏感的话,那么他会帮你节约大量的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anyan-T

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值