java日期时间API详解

23 篇文章 0 订阅

基于JDK8

下面是基于JDK8来进行编码和讲解的。

重新定义

java8对时间和日期相关的操作进行了重新分类和整理,使得使用起来更加方便和实用。

  • 对时间和日期的相关操作进行了细分:时间、日期、时间&日期,时间戳、时间段、格式化
  • 所有类都是不可变的、线程安全的
  • 兼容旧的日期和时间

API

对于一般来说,常用的API就是下面所列出的六种,在实际使用的过程中,需要哪个就使用哪个来进行操作。

  • LocalDateTime:日期时间
  • LocalDate:仅表示日期
  • LocalTime:仅表示时间
  • Peroid:仅表示日期间隔
  • Duration:时间间隔,以秒和纳秒为单位
  • DateTimeFormatter:可以格式化LocalDate,LocalTime以及LocalDateTime

常见用法

下面分别展示几个常见的用法,基本涵盖了常见的使用场景。

  • 获取当前时间
LocalDateTime localDateTime = LocalDateTime.now();
// 打印结果: 2019-12-05T16:58:11.936
  • 获取指定时间
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 12, 2, 23, 59, 59);
// 打印结果: 2019-12-02T23:59:59
  • 日期/时间加减操作
// localDateTime2的基础上加1天零1s
LocalDateTime localDateTime3 = localDateTime2.plusDays(1).plusSeconds(1);
// 打印结果:2019-12-04T00:00
  • 获取指定的字段(年月日时分秒,纳秒,不支持毫秒)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("现在是: " + localDateTime.getYear() + " 年中的第 " + localDateTime.getDayOfYear() +" 天");
// 现在是: 2019 年中的第 339 天 
  • 获取UTC时间(格林尼治时间)
Instant instant = Instant.now();
// 打印结果:2019-12-05T09:09:21.360Z
  • 获取北京时间(东8区)
// OffsetTime表示有时差的时间,除了UTC时间,都是OffsetTime
 Instant instant = Instant.now();
 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
// 打印结果: 2019-12-05T17:10:38.330+08:00
  • 获取毫秒数(1970-01-01T00:00:00Z开始计算)
Instant instant = Instant.now();
long epochMilli = instant.toEpochMilli();
// 打印结果:1575537087543
  • 定义时间戳
Instant instant1 = Instant.ofEpochSecond(59);
// 打印结果: 1970-01-01T00:00:59Z
instant2 = instant1.plusSeconds(99)
// 打印结果:1970-01-01T00:02:38Z
  • 计算日期间隔(参数位置影响结果哦)
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(99);

Duration duration1 = Duration.between(instant1, instant2);
Duration duration2 = Duration.between(instant2, instant1);
// 打印结果 duration1:PT1M39S
// 打印结果 duration2:PT-1M-39S

long duration1Seconds = duration1.getSeconds();
long duration2Seconds = duration1.getSeconds();
// 打印结果 duration1Seconds: 90
// 打印结果 duration2Seconds: -90
  • 操作时间间隔
Duration duration3 = duration1.plusDays(1);
// 打印结果:PT24H1M39S

注意 : 仅支持时间操作(Instant, LocalTime,LocalDateTime),不支持日期(LocalDate)

  • 日期间隔
 LocalDate localDate1 = LocalDate.now();
 LocalDate localDate2 = localDate1.plusDays(1);
 Period period = Period.between(localDate1, localDate2);
 long days =  period.getDays();
 //输出结果P1D
 //输出结果1
  • 获取指定日期或时间
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(20);
// 打印结果 localDateTime1:2019-12-09T11:08:25.055
// 打印结果 localDateTime2:2019-12-20T11:08:25.055
  • 获取下一个固定日期(下一个星期天)
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
// 打印结果 localDateTime3:2019-12-15T11:09:46.092
  • 定义矫正器
获取下一个工作日
    LocalDateTime localDateTime4 = localDateTime.with((tempDateTime) -> {
            LocalDateTime localDateTime5 = (LocalDateTime) tempDateTime;
            DayOfWeek dayOfWeek = localDateTime5.getDayOfWeek();
            if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
                    return localDateTime5.plusDays(3);
            } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
                    return localDateTime5.plusDays(2);
            } else {
                    return localDateTime5.plusDays(1);
            }
    });
// 打印结果 localDateTime4:2019-12-10T11:11:57.218
  • 日期时间格式化
 		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.now();
        String dateStr =dateTimeFormatter.format(localDateTime);
        System.out.println(dateStr);
        // 打印结果: 2019-12-09 11:13:40
        LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
        System.out.println(localDateTime2);
        // 打印结果: 2019-12-09T11:13:40
        LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
        System.out.println(localDate);
        // 打印结果: 2019-12-09

基于Instant进行转换

Java8对于时间戳、日期时间以及老版本的Date对象之间的转化也进行了兼容和适配,所有转化操作都可以基于Instant对象进行,下面使用LocalDateTime进行演示

  • 时间戳转LocalDate,LocalDate,LocalDateTime
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印结果:2019-12-09T11:22:42.629
  • LocalDate,LocalDate,LocalDateTime转时间戳
LocalDateTime localDateTime = LocalDateTime.now();
long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 打印结果:1575861905995
  • 兼容旧版本Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Date date = Date.from(localDateTime3.atZone(ZoneOffset.ofHours(8)).toInstant());
LocalDateTime localDateTime4  = localDateTime3.atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印结果 date:Mon Dec 09 11:30:04 CST 2019
// 打印结果 lcoalDateTime4:2019-12-09T11:30:04.470
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值