背景

之前研究了一下java里边的Date和Calendar是怎么实现的(《Calendar源码--JDK是怎么计算时间的》),然后发现有文章介绍到java8有LocalDate,然后想着看一下这是什么东西,结果就过了这么久。

前置总结

根据在网上搜到的资料,发现java8的LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Period、Duration等都在java.time包里,Date、Calendar是在java.util包里。

既然以前有了Date、Calendar,为什么还要在java8里新写一份这样的API呢?其实有三个原因(1)线程安全问题,Date、Calendar不是线程安全的(2)易用性和易理解性,Date、Calendar的设计感较弱,易用性差、难理解(深有体会。。。)(3)时区问题,这个其实也可以算是易用性的一个点,Date、Calendar需要考虑时区问题,绕来绕去容易绕晕,有时候对于一个时间其实是无感于时区的。

新的API提供的能力就很好的解决了上面的三个问题,其实java8以后完全可以不用Date、Calendar了。另外,java8的time API和joda-time的使用方法很像,因为是同一个人做的。

代码示例

参考自:https://www.kancloud.cn/wizardforcel/java8-new-features/148349

基本上自己跑一下示例,就差不多知道该怎么用了

package com.meituan.recommend.biz.guess;import java.time.*;
import java.time.chrono.ChronoLocalDateTime;
import java.time.chrono.Chronology;
import java.time.chrono.HijrahChronology;
import java.time.format.DateTimeFormatter;
import java.time.temporal.IsoFields;
import java.util.Date;public class TimeIntroduction {public static void testClock() throws InterruptedException {//时钟提供给我们用于访问某个特定 时区的 瞬时时间、日期 和 时间的。Clock c1 = Clock.systemUTC(); //系统默认UTC时钟(当前瞬时时间 System.currentTimeMillis())System.out.println(c1.millis()); //每次调用将返回当前瞬时时间(UTC)Clock c2 = Clock.systemDefaultZone(); //系统默认时区时钟(当前瞬时时间)System.out.println(c2.millis()); //每次调用将返回系统默认时区的当前瞬时时间Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区System.out.println(c31.millis()); //每次调用将返回当前瞬时时间(UTC)Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区System.out.println(c32.millis());//每次调用将返回当前瞬时时间(UTC)Clock c4 = Clock.fixed(Instant.now(), ZoneId.of("Asia/Shanghai"));//固定上海时区时钟System.out.println(c4.millis());Thread.sleep(1000);System.out.println(c4.millis()); //不变 即时钟时钟在那一个点不动Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒的时钟System.out.println(c1.millis());System.out.println(c5.millis());}public static void testInstant() {//瞬时时间 相当于以前的System.currentTimeMillis()Instant instant1 = Instant.now();System.out.println(instant1.getEpochSecond());//精确到秒 得到相对于1970-01-01 00:00:00 UTC的一个时间System.out.println(instant1.toEpochMilli()); //精确到毫秒Clock clock1 = Clock.systemUTC(); //获取系统UTC默认时钟Instant instant2 = Instant.now(clock1);//得到时钟的瞬时时间System.out.println(instant2.toEpochMilli());Clock clock2 = Clock.fixed(instant1, ZoneId.systemDefault()); //固定瞬时时间时钟Instant instant3 = Instant.now(clock2);//得到时钟的瞬时时间System.out.println(instant3.toEpochMilli());//equals instant1}public static void testLocalDateTime() {//使用默认时区时钟瞬时时间创建 Clock.systemDefaultZone() -->即相对于 ZoneId.systemDefault()默认时区LocalDateTime now = LocalDateTime.now();System.out.println(now);//自定义时区LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Europe/Paris"));System.out.println(now2);//会以相应的时区显示日期//自定义时钟Clock clock = Clock.system(ZoneId.of("Asia/Dhaka"));LocalDateTime now3 = LocalDateTime.now(clock);System.out.println(now3);//会以相应的时区显示日期//不需要写什么相对时间 如java.util.Date 年是相对于1900 月是从0开始//2013-12-31 23:59LocalDateTime d1 = LocalDateTime.of(2013, 12, 31, 23, 59);//年月日 时分秒 纳秒LocalDateTime d2 = LocalDateTime.of(2013, 12, 31, 23, 59, 59, 11);//使用瞬时时间 + 时区Instant instant = Instant.now();LocalDateTime d3 = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());System.out.println(d3);//解析String--->LocalDateTimeLocalDateTime d4 = LocalDateTime.parse("2013-12-31T23:59");System.out.println(d4);LocalDateTime d5 = LocalDateTime.parse("2013-12-31T23:59:59.999");//999毫秒 等价于999000000纳秒System.out.println(d5);//使用DateTimeFormatter API 解析 和 格式化DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");LocalDateTime d6 = LocalDateTime.parse("2013/12/31 23:59:59", formatter);System.out.println(formatter.format(d6));//时间获取System.out.println(d6.getYear());System.out.println(d6.getMonth());System.out.println(d6.getDayOfYear());System.out.println(d6.getDayOfMonth());System.out.println(d6.getDayOfWeek());System.out.println(d6.getHour());System.out.println(d6.getMinute());System.out.println(d6.getSecond());System.out.println(d6.getNano());//时间增减LocalDateTime d7 = d6.minusDays(1);LocalDateTime d8 = d7.plus(1, IsoFields.QUARTER_YEARS);//LocalDate 即年月日 无时分秒//LocalTime即时分秒 无年月日//API和LocalDateTime类似就不演示了}public static void testZonedDateTime() {//即带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义)。//API和LocalDateTime类似,只是多了时差(如2013-12-20T10:35:50.711+08:00[Asia/Shanghai])ZonedDateTime now = ZonedDateTime.now();System.out.println(now);ZonedDateTime now2 = ZonedDateTime.now(ZoneId.of("Europe/Paris"));System.out.println(now2);//其他的用法也是类似的 就不介绍了ZonedDateTime z1 = ZonedDateTime.parse("2013-12-31T23:59:59Z[Europe/Paris]");System.out.println(z1);}public static void testDuration() {//表示两个瞬时时间的时间段Duration d1 = Duration.between(Instant.ofEpochMilli(System.currentTimeMillis() - 12323123), Instant.now());//得到相应的时差System.out.println(d1.toDays());System.out.println(d1.toHours());System.out.println(d1.toMinutes());System.out.println(d1.toMillis());System.out.println(d1.toNanos());//1天时差 类似的还有如ofHours()Duration d2 = Duration.ofDays(1);System.out.println(d2.toDays());}public static void testChronology() {//提供对java.util.Calendar的替换,提供对年历系统的支持Chronology c = HijrahChronology.INSTANCE;ChronoLocalDateTime d = c.localDateTime(LocalDateTime.now());System.out.println(d);}/*** 新旧日期转换*/public static void testNewOldDateConversion() {Instant instant = new Date().toInstant();Date date = Date.from(instant);System.out.println(instant);System.out.println(date);}public static void main(String[] args) throws InterruptedException {
//        testClock();
//        testInstant();
//        testLocalDateTime();
//        testZonedDateTime();
//        testDuration();
//        testChronology();testNewOldDateConversion();}
}

相关文章

不再细写介绍了,直接引用文章。

对于java8中API的中文介绍,很容易理解,且例子详实:https://lw900925.github.io/java/java8-newtime-api.html

对于java8中时间API的英文介绍,讲解非常顺畅,示例很充分,单词都很简单,可以一看:https://www.baeldung.com/java-8-date-time-intro

有时候,我们需要进行LocalDate和Date的互相转换,参考:https://www.jianshu.com/p/b4629857fc6f

后续

可以看下源码怎么实现的

java8的LocalDate、LocalDateTime和之前的Date、Calendar相关推荐

  1. 如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

    下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java8 ...

  2. 一文搞懂Java8中表示当前的时间类Date、Instant、LocalDateTime、ZonedDateTime

    1. 概述 Java8中的时间类主要有:Date.Instant.LocalDateTime(LocalDate.LocalTime).ZonedDateTime,除去Date,java.time包下 ...

  3. java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime

    一.简介 Date:java.util.Date包,包含日期,时间,毫秒数. Calendar:java.util.Calendar包,abstract修饰,Date的很多方法已经过时迁移到了Cale ...

  4. LocalDate LocalDateTime Date 转换

    1.LocalDateTime --> Date eg:  Instant ins = LocalDateTime.now().atZone(ZoneId.systemDefault()).to ...

  5. java8 新特性精心整理(全)——新 Date/Time API

    https://blog.csdn.net/sanri1993/article/details/101176712 前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自 ...

  6. Java8的LocalDate类用来获取年月日的开始结束时间,当前时间

    Java8的LocalDate类用来获取年月日的开始结束时间,当前时间 文章目录 Java8的LocalDate类用来获取年月日的开始结束时间,当前时间 一.获取本日开始结束时间? 二.获取本周开始结 ...

  7. java里 currenttime_java 获取当前时间LocalDateTime currentTimeMillis java.util.Date

    总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...

  8. 在java.time.LocalDateTime和java.util.Date之间进行转换

    本文翻译自:Converting between java.time.LocalDateTime and java.util.Date Java 8 has a completely new API ...

  9. Java8新特性LocalDateTime获取年,月,周,当年第X周

    前言 基本上大家在JAVA中获取时间都是使用java.util.Date类或使用java.util.Calendar日历类,本篇博文主要给大家介绍Java8以后时间类java.time.LocalDa ...

最新文章

  1. 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
  2. Unity加载配置文件的两种方式
  3. ASP.NET比较常用的26个性能优化技巧
  4. 洛谷P1962 斐波那契数列题解
  5. QT的QException类的使用
  6. winrar5.50去广告教程(仅供学习使用)
  7. 黄冈学计算机的学校怎么样,广元市黄冈学校怎么样、好不好
  8. 活动目录的灾难恢复操作指导之三
  9. 3t硬盘坏道检测需要多久_卤素检测报告需要多久更新一次
  10. 使用datepickerdialog提示is undefined错误_23.5 使用视图
  11. python 全部缩进一行_每天三分钟一起学python之(三)python的基本语法
  12. Makefile自动生成:cmake
  13. Bus hound USTS
  14. go及IDE LiteIDE的安装及环境变量配置
  15. 车载高德地图显示服务器信息,车载高德一直gps定位中,怎么解决高德地图导航gps信号弱...
  16. matlab 呼吸灯,一种控制呼吸灯呼吸效果的方法与流程
  17. requests爬取图片(百思不得其姐)
  18. 热身赛-巴西5-1坦桑尼亚 卡卡传射罗比两破门
  19. 马斯克回应福特CEO喊话:我已经有一辆Cybertruck了
  20. GitHub下载 无法分配请求的地址_Hexo+Github--搭建个人博客(一)准备工作amp;amp;环境搭建

热门文章

  1. spd耗材管理流程图_医用耗材SPD管理模式详解
  2. 童年依恋风格影响成年后的两性关系
  3. 《途客圈创业记:不疯魔,不成活》一一2.9 UX再造
  4. ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库
  5. 旅行的目的和意义何在?(转…
  6. 由七芒星引出来的——关于142857
  7. Mac OS下不产生.DS_Store 隐藏文件和清理.DS_Store的方法
  8. MapReduce任务卡在Running Job状态的多种解决方法
  9. numpy均匀分布_Numpy的基本操作
  10. IE8允许ActiveX控件设置