请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

都9012了,Java8中的日期时间API你还没有掌握?

[复制链接]
查看: 92|回复: 0

1万

主题

2万

帖子

5万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
52039
发表于 2019-12-3 04:18 | 显示全部楼层 |阅读模式
工作这么久了,对于Java中时候日期的操纵不停很蛋疼,一会用Date,一会用Calendar一会用LocalDateTime,始终没有认真总结过它们的联系与区分。模暗昧糊用了好几年了,本日终究搞清楚了!
一,Java8日期时候API发生的后果结果

1.1 为什么要重新界说一套日期时候API

  • 操纵不方便:java中最初的Date不能间接对指定字段举行加减操纵也不支持国际化,后来新增了Calendar,可是Calendar又不支持格式化操纵,需要转换成Date再举行格式化,总之不停在填坑,操纵起来一点都不够文雅。
  • 线程不服安:Date,Caleandar,SimpleDateFormat都是可变的,线程不服安的,所以你需要编写额外的代码处置赏罚线程平安题目。
1.2 Java8重新界说

  • 对时候日期相关操纵举行细分:时候,日期,日期&时候,时候戳,时候段,日期段,格式化等
  • 全数类都是不成变的,线程平安
  • 兼容旧的日期时候
都9012了,Java8中的日期时间API你还没有掌握?  游戏 1055780-20191203010218008-347765558

1.3Java8兼容就版本的Date,同时也标准了日期时候的转换流程。
都9012了,Java8中的日期时间API你还没有掌握?  游戏 1055780-20191203010218284-38976930

一,给人读的( LocalDateTime & LocalDate & LocalTime)

java8中将时候和日期举行的区分,用LocalDateTime表示日期和时候,LocalDate用来表示日期而LocalTime表示时候。内部实现也很是好明白,LocalDateTime = LocalDate + LocalTime,而且他们的内部api也齐截,所以笔者就结合工作中的履历,先容他们最多见的用法。
1.1 获得当前时候
  1. LocalDateTime localDateTime = LocalDateTime.now();// 打印结果: 2019-12-02T22:09:20.503
复制代码
1.2 获得指按时候
  1. // 获得 2019年12月02号 23 : 59 : 59 LocalDateTime localDateTime2 = LocalDateTime.of(2019, 12, 2, 23, 59, 59);// 打印结果: 2019-12-02T13:20:20
复制代码
1.3 日期/时候加减操纵
  1. // localDateTime2的底子上加1天零1sLocalDateTime localDateTime3 = localDateTime2.plusDays(1).plusSeconds(1);// 打印结果:2019-12-04T00:00
复制代码
1.4 获得指定的字段(年月日时分秒,纳秒,不支持毫秒)
  1. System.out.println("现在是: " + localDateTime.getYear() + " 年中的第 " + localDateTime.getDayOfYear() +" 天");// 打印结果:现在是: 2019 年中的第 336 天 // 画外音: 快过年了呀,感受这一年又没啥功劳
复制代码
二,给盘算机读的(Instant)

小常识:地球上不同地域经度不同会别离时区,以零度经线上为准(格林尼治天文台原址,UTC时区)为准,将地球上各个部分分为了24个时区。向西走,每过一个时区,就要把表拨慢1个小时;同理每向东走一个时区,就要把表拨快1个小时。末端,中国处于东8区。
2.1 获得UTC时候(格林尼治时候)
  1. Instant instant = Instant.now();// 打印结果: 2019-12-02T14:31:41.661Z
复制代码
2.2 获得北京时候(东8区)
  1. // OffsetTime表示偶然差的时候,除了UTC时候,都是OffsetTimeOffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 打印结果: 2019-12-02T22:31:41.661+08:00
复制代码
2.3 获得毫秒数(1970-01-01T00:00:00Z起头盘算)
  1. long epochMilli = instant.toEpochMilli()// 打印结果:1575297101661
复制代码
2.4 界说时候戳
  1. Instant instant1 = Instant.ofEpochSecond(59);// 打印结果: 1970-01-01T00:00:59Zinstant2 = instant1.plusSeconds(99)// 打印结果:2019-12-02T14:43:00.402Z
复制代码
三, 时候间隔(Duration)

3.1 盘算日时代隔(参数位置影响结果哦)
  1. 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-39Slong duration1Seconds = duration1.getSeconds();long duration2Seconds = duration1.getSeconds();// 打印结果 duration1Seconds: 90// 打印结果 duration2Seconds: -90
复制代码
3.2 操纵时候间隔
  1. Duration duration3 = duration1.plusDays(1);// 打印结果:PT24H1M39S
复制代码
留意 : 仅支持时候操纵(Instant, LocalTime,LocalDateTime),不支持日期(LocalDate)
四,日时代隔(Period)
  1. LocalDate localDate1 = LocalDate.now();LocalDate localDate2 = localDate1.plusDays(1);Period period = Period.between(localDate1, localDate2);long days =  period.getDays();// 打印结果 peroid: P1D// 打印结果 days: 1
复制代码
五,日期/时候校正器(TemporalAdjuster)

5.1 获得指定日期或时候
  1. LocalDateTime localDateTime1 = LocalDateTime.now();LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(20);// 打印结果 localDateTime1:2019-12-02T22:57:47.674// 打印结果 localDateTime2:2019-12-20T22:57:47.674
复制代码
5.2 获得下一个牢固日期(下一个星期天)
  1. LocalDateTime localDateTime3 = localDateTime.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));// 打印结果 localDateTime33:2019-12-08T23:00:43.101
复制代码
5.3 自界说更正器
  1. // 获得下一个工作日    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-03T23:00:43.101
复制代码
六,日期时候格式化
  1. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime localDateTime = LocalDateTime.now();String dateStr =dateTimeFormatter.format(localDateTime);// 打印结果: 2019-12-02 23:08:55LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);// 打印结果: 2019-12-02T23:08:55LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);// 打印结果: 2019-12-02
复制代码
七,基于Instant举行转换

java8api对于时候戳,日期时候以及老版本的Date工具之间的转换也举行了兼容和适配,全数的转换操纵都可以基于Instant工具举行。由于LocalDate,LocalTime和LocalDateTime三个类的操纵完全一样,所以下文仍操纵LocalDateTime演示。
7.1 时候戳转LocalDate,LocalDate,LocalDateTime
  1. long timestamp = Instant.now().toEpochMilli();LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();// 打印结果:2019-12-02T23:20:25.791
复制代码
7.2 LocalDate,LocalDate,LocalDateTime转时候戳
  1. LocalDateTime localDateTime = LocalDateTime.now();long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();// 打印结果:1575300368099
复制代码
7.3 兼容就版本Date
  1. LocalDateTime localDateTime3 = LocalDateTime.now();Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());LocalDateTime localDateTime4 = localDateTime3.atZone(ZoneOffset.ofHours(8)).toLocalDateTime();// 打印结果 date:Mon Dec 02 23:32:53 CST 2019// 打印结果 lcoalDateTime4:2019-12-02T23:32:53.188
复制代码
八, Q&A

上一篇题目:在java中凡是操纵synchronized来实现方式同步,AQS中经过CAS保证了点窜同步状态的齐截性题目,那末对照synchronized,cas有什么上风不同与上风呢?你还晓得其他无锁并发的计谋吗?
8.1 Answer
Java中的无锁并发计谋可以分为三种:

  • 基于悲观锁的CAS操纵
  • Copy On Write:写时复制是指:在并发拜候的情况下,当需要点窜JAVA中Containers的元素时,不间接点窜该容器,而是先复制一份副本,在副本上举行点窜。点窜完成以后,将指向本来容器的援用指向新的容器(副本容器)
  • ThreadLocal:线程当地存储,就是为每一个线程建立一个变量,只要本线程可以在该变量中检察和点窜值。
8.2 Question

  • 这是一道送分题:正如上文提到的,Java8之前的日期时候以及格式化类是线程不服安的,你晓得怎样编写测试代码吗?
  • 假如文雅得获得昨天0点整的毫秒值?
进修Java进程中大要碰到题目和困惑,关注我vx公众号 “cruder” ,布景留言,笔者帮你一路打点!(需要进修材料的请关注后布景留言,重要都是java相关,java底子,并发,mysql,redis,es,mq等都都有!)
都9012了,Java8中的日期时间API你还没有掌握?  游戏 1055780-20191203010219149-2029822186


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表