java8的LocalDate、LocalDateTime和之前的Date、Calendar
背景
之前研究了一下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相关推荐
- 如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类
下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java8 ...
- 一文搞懂Java8中表示当前的时间类Date、Instant、LocalDateTime、ZonedDateTime
1. 概述 Java8中的时间类主要有:Date.Instant.LocalDateTime(LocalDate.LocalTime).ZonedDateTime,除去Date,java.time包下 ...
- java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime
一.简介 Date:java.util.Date包,包含日期,时间,毫秒数. Calendar:java.util.Calendar包,abstract修饰,Date的很多方法已经过时迁移到了Cale ...
- LocalDate LocalDateTime Date 转换
1.LocalDateTime --> Date eg: Instant ins = LocalDateTime.now().atZone(ZoneId.systemDefault()).to ...
- java8 新特性精心整理(全)——新 Date/Time API
https://blog.csdn.net/sanri1993/article/details/101176712 前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自 ...
- Java8的LocalDate类用来获取年月日的开始结束时间,当前时间
Java8的LocalDate类用来获取年月日的开始结束时间,当前时间 文章目录 Java8的LocalDate类用来获取年月日的开始结束时间,当前时间 一.获取本日开始结束时间? 二.获取本周开始结 ...
- java里 currenttime_java 获取当前时间LocalDateTime currentTimeMillis java.util.Date
总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...
- 在java.time.LocalDateTime和java.util.Date之间进行转换
本文翻译自:Converting between java.time.LocalDateTime and java.util.Date Java 8 has a completely new API ...
- Java8新特性LocalDateTime获取年,月,周,当年第X周
前言 基本上大家在JAVA中获取时间都是使用java.util.Date类或使用java.util.Calendar日历类,本篇博文主要给大家介绍Java8以后时间类java.time.LocalDa ...
最新文章
- 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
- Unity加载配置文件的两种方式
- ASP.NET比较常用的26个性能优化技巧
- 洛谷P1962 斐波那契数列题解
- QT的QException类的使用
- winrar5.50去广告教程(仅供学习使用)
- 黄冈学计算机的学校怎么样,广元市黄冈学校怎么样、好不好
- 活动目录的灾难恢复操作指导之三
- 3t硬盘坏道检测需要多久_卤素检测报告需要多久更新一次
- 使用datepickerdialog提示is undefined错误_23.5 使用视图
- python 全部缩进一行_每天三分钟一起学python之(三)python的基本语法
- Makefile自动生成:cmake
- Bus hound USTS
- go及IDE LiteIDE的安装及环境变量配置
- 车载高德地图显示服务器信息,车载高德一直gps定位中,怎么解决高德地图导航gps信号弱...
- matlab 呼吸灯,一种控制呼吸灯呼吸效果的方法与流程
- requests爬取图片(百思不得其姐)
- 热身赛-巴西5-1坦桑尼亚 卡卡传射罗比两破门
- 马斯克回应福特CEO喊话:我已经有一辆Cybertruck了
- GitHub下载 无法分配请求的地址_Hexo+Github--搭建个人博客(一)准备工作amp;amp;环境搭建
热门文章
- spd耗材管理流程图_医用耗材SPD管理模式详解
- 童年依恋风格影响成年后的两性关系
- 《途客圈创业记:不疯魔,不成活》一一2.9 UX再造
- ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库
- 旅行的目的和意义何在?(转…
- 由七芒星引出来的——关于142857
- Mac OS下不产生.DS_Store 隐藏文件和清理.DS_Store的方法
- MapReduce任务卡在Running Job状态的多种解决方法
- numpy均匀分布_Numpy的基本操作
- IE8允许ActiveX控件设置