java8的日期时间API

    • java8 datetime api有什么
    • LocalDate
    • LocalDate 与 Date 转换
    • LocalTime
    • LocalDateTime
    • LocalDateTime 与 Date
    • Instant
    • ZoneId
    • 日期计算

Java的日期时间API,一直有一些令人头疼的问题。

有了 java.util.Date 又搞出个java.sql.Date,改个名字不行?

好好的new Date(year,month,day) 早早的就被标记为 @Deprecated,那时候还是jdk1.1,如今都java9了,还没删除。

好吧,又给了一个Calendar,每次一个操作,都感觉,IDE一行设置80个字符,是真不够。

我想搞个纯日期,那叫一个麻烦,相信很多人都这么写:

Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
Date date=cal.getTime();

心塞~

貌似看起来Calendar比Date好一点,但他继承了Date一个很恶心的特性,月份问题。

System.out.println(cal.getTime());//Fri Nov 17 12:00:00 CST 2017
System.out.println(cal.get(Calendar.MONTH));//10

java8终于有了个改观,那就是引入了joda-time的API,虽然仍然没有joda好用。

java8 datetime api有什么?

日期时间API将日期和时间分开为LocalDate和LocalTime;

既有日期又有时间,则使用 LocalDateTime;

改善了jdk的TimeZone,使用更优雅的ZoneId;

增加了 Instant 的概念,可以理解为时间线上的一个瞬间;

LocalDate

//获取当前日期
LocalDate date1=LocalDate.now();
System.out.println(date1);

//获取指定日期
LocalDate date2=LocalDate.of(2017, 12, 24);
System.out.println(date2);

//获取当月第一天日期
LocalDate minus = date1.minus(date1.getDayOfMonth()-1,ChronoUnit.DAYS);
System.out.println(minus);

LocalDate 与 Date 转换

//LocalDate -> Date
LocalDate localDate1=LocalDate.now();
ZoneId zoneId=ZoneId.systemDefault();
Instant instant=localDate1.atStartOfDay(zoneId).toInstant();
Date from = Date.from(instant);
System.out.println(from);

//Date 转 LocalDate
Date date2=new Date();
Instant instant = date2.toInstant();
ZoneId zoneId=ZoneId.systemDefault();
LocalDate localDate2 = instant.atZone(zoneId).toLocalDate();
System.out.println(localDate);

LocalTime

实际单纯使用时间的场景,并没有单纯使用日期的时间多。而且,LocalDate的思路捋清楚,LocalTime的使用大同小异,以后再补充吧。

LocalDateTime

结合了LocalDate 和 LocalTime,也就是传统意义上类似Date的时间。

LocalDate localDate = dt.toLocalDate();
LocalTime localTime = dt.toLocalTime();

LocalDateTime 与 Date

Date 转 LocalDateTime
Date date = new Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);

# LocalDateTime 转 Date
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
Date date = Date.from(instant);

Instant

从前面的格式转换可以看出。

Date -> Instant -(ZoneId)-> LocalDate

用文字描述,就是 Date 可以转换为 Instant;Instant 可以借助ZoneId 转换为LocalDate。反之亦然。

ZoneId

ZoneId zoneId=ZoneId.systemDefault();
System.out.println(zoneId);
TimeZone tz=TimeZone.getDefault();
System.out.println(tz);

输出:

Asia/Shanghai
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]

ZoneId忽略了哪些用处不大的信息,更清晰。如果必要的时候,可以在属性 zoneId.getRules() 中获取。

日期计算

在日期计算上,引入的joda-time特性,实在太方便了。

比如,如果要得到本月的第一天的日期,那么以前我们需要这么做。

Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);

cal.set(Calendar.DAY_OF_MONTH,1);
System.out.println(cal.getTime());

现在呢?

LocalDate date=LocalDate.now().withDayOfMonth(1);
System.out.println(date);

如果我们希望计算当前时间的前一天的时刻,以前需要这么做:

Calendar cal=Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -1);

现在呢?

LocalDateTime date=LocalDateTime.now().minusDays(1);

既简单,语义也更佳。支持链式语法,编码方便。

我的博客即将入驻“”,诚邀技术同仁一同入驻。

时间: 2024-10-29 14:00:26

java8的日期时间API的相关文章

Java8新日期时间API的20个使用示例_java

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及日期功能提供更好的支持了,这对已经习惯使用Joda时间日期库的社区而言也是件好事.关于这个新的时间日期库的最大的优点

JSR 310:一种新的Java日期/时间API

JSR 310 是一个用于执行与时间和日历有关的计算的 API,已经得到 Java SE 7 的推荐.该 API 的 目标是取代现有的两个构成 Java 的当前日期和时间 API 的类:java.util.Date 和 java.util.Calendar,同时仍然提供对这些旧有 API 的向后兼容访问.JSR 当前正在开发,并且该 API 有一个可用的试验性 Javadoc. 对 Java 6 日期/时间 API 的改进 JSR 310 日期/时间 API 试图通过提供更好的性能和易用性改进

PHP日期时间函数的高级应用技巧

详细讲解PHP的日期时间函数date()中介绍了PHP日期时间函数的简单用法,这类将介绍更多的函数来丰富我们的应用. checkdate($month,$date,$year) 如果应用的值构成一个有效日期,则该函数返回为真.例如,对于错误日期2005年2月31日,此函数返回为假. 在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效. <?php// returns falseecho checkdate(2,30,2005) ? "valid" : "

PHP中日期时间函数date()用法总结

格式化日期 date() 函数的第一个参数规定了如何格式化日期/时间.它使用字母来表示日期和时间的格式.这里列出了一些可用 的字母: •d - 月中的天 (01-31) •m - 当前月,以数字计 (01-12) •Y - 当前的年(四位数) 您可以在我们的 PHP Date 参考手册中,找到格式参数中可以使用的所有字母. 可以在字母之间插入其他字符,比如 "/"."." 或者 "-",这样就可以增加附加格式了:  代码如下 复制代码 <?

PHP日期时间函数的高级应用技巧_php技巧

checkdate($month,$date,$year) 如果应用的值构成一个有效日期,则该函数返回为真.例如,对于错误日期2005年2月31日,此函数返回为假. 在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效. <?php// returns falseecho checkdate(2,30,2005) ? "valid" : "invalid";// returns trueecho checkdate(4,6,2010) ? &qu

PHP 日期时间函数的高级应用技巧_php技巧

PHP的日期时间函数date() 1,年-月-日 echo date('Y-m-j'); 2007-02-6 echo date('y-n-j'); 07-2-6 大写Y表示年四位数字,而小写y表示年的两位数字: 小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字. echo date('Y-M-j'); 2007-Feb-6 echo date('Y-m-d'); 2007-02-06 大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0); 没有大写的J,只有小写j

php checkdate、getdate等日期时间函数操作详解_php技巧

checkdate($month,$date,$year) 如果应用的值构成一个有效日期,则该函数返回为真.例如,对于错误日期2005年2月31日,此函数返回为假. 在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效. 复制代码 代码如下: <?php // returns false echo checkdate(2,30,2005) ? "valid" : "invalid"; // returns true echo checkdate(

jQuery EasyUI API 中文文档 - 日期时间框(DateTimeBox)

DateTimeBox  日期时间框 扩展自 $.fn.datebox.defaults.用 $.fn.datetimebox.defaults 重写了 defaults.     依赖 datebox timespinner 用法 1. <input id="dt" type="text"></input> 取值: $('#DateEnd').datetimebox('getValue') 1. $('#dt').datetimebox({

第一个ASP组件:设置服务器日期时间组件

服务器 网络之门 在进入我们需习的第一个组件之前,小虎首先得说明一下,由于小虎的水平有限,可能在下面的这些说明过程中存在不少错误,希望大家提出指证,在这里我希望能与大家分享一下ASP的学习经验,小虎的这个网站推耸的是原创精神,很多东西都是DIY,因此程序编写过程中也会染上小虎本身不良的编程习惯.而且整个教学网站也只有小虎一个维护,因此技术上肯定存在不少问题,望大家谅解. ASP组件为我们的ASP编程提供了强大的扩展功能,比如我们需要在服务器中启动一个应用程序,设置服务器的时间,访问操作系统内部信