点击上方蓝字关注「程序新视界」

Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理。同样的,如果你现在依旧在项目中使用传统Date、Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过。来刷新你的知识库吧!

背景

Java对日期、日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全;还有用于格式化日期的类DateFormat也是非线程安全的等问题。

Java8引入的新的一系列API,对时间日期的处理提供了更好的支持,清楚的定义了时间日期的一些概念,比如说,瞬时时间(Instant),持续时间(duration),日期(date),时间(time),时区(time-zone)以及时间段(Period)。

同时,借鉴了Joda库的一些优点,比如将人和机器对时间日期的理解区分开的。

简介

新的时间日期API核心位于java.time内,另外也在java.time.chrono,java.time.format,java.time.temporal和java.time.zone有相关的API,但使用频次较少。

Java8常用的日期和时间类包含LocalDate、LocalTime、Instant、Duration、Period、LocalDateTime以及ZonedDateTime等。

  • LocalDate:不包含时间的日期,比如2019-10-14。可以用来存储生日,周年纪念日,入职日期等。

  • LocalTime:与LocalDate想对照,它是不包含日期的时间。

  • LocalDateTime:包含了日期及时间,没有偏移信息(时区)。

  • ZonedDateTime:包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

  • Instant:时间戳,与System.currentTimeMillis()类似。

  • Duration:表示一个时间段。

  • Period:用来表示以年月日来衡量一个时间段。

另外,还有新的日期解析格式化类DateTimeFormatter。

学习最佳的途径就是去实践它,现在我们示例的形式来讲每个知识点进行讲解。

LocalDate-如何获得日期

LocalDate类内只包含日期,不包含具体时间。只需要表示日期而不包含时间,就可以使用它。

// 只获取日期LocalDate today = LocalDate.now();System.out.println(today);

int year = today.getYear();int month = today.getMonthValue();int day = today.getDayOfMonth();

System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);

同时,还可以通过LocalDate获取日期是月份的第几天、周的第几天,月份的天数,是否为闰年等。看下面的代码是不是非常方便。

LocalDate today = LocalDate.now();// 月份中的第几天int dayOfMonth = today.getDayOfMonth();// 一周的第几天DayOfWeek dayOfWeek = today.getDayOfWeek();// 月份的天数int length = today.lengthOfMonth();// 是否为闰年boolean leapYear = today.isLeapYear();

上面通过now获取LocalDate对象,也可以通过静态方法of()或parse创建任意一个日期。再也不用像之前一样年只能从1900年开始,月必须从0开始等。

LocalDate oneDay = LocalDate.of(2019,10,1);System.out.println(oneDay);

LocalDate parseDay = LocalDate.parse("2019-10-01");System.out.println(parseDay);

打印结果:2019-10-01。

LocalDate重写了equals方法,让日期的比较也变得简单了。

// 定义任意日期LocalDate oneDay = LocalDate.of(2019, 10, 1);System.out.println(oneDay);

// 定义任意比较LocalDate anyDay = LocalDate.of(2019, 10, 1);System.out.println(oneDay.equals(anyDay));

同时,针对日期还可延伸出MonthDay或YearMonth类,顾名思义,只包含月天或年月。同样适用于equals方法来比较。

另外使用before和after可以比较两个日期前后时间。

boolean notBefore = LocalDate.parse("2019-10-01").isBefore(LocalDate.parse("2019-10-02"));boolean isAfter = LocalDate.parse("2019-10-01").isAfter(LocalDate.parse("2019-10-02"));

对日期进行前一天后一天或前一个月的加减也变得十分方便。

LocalDate tomorrowDay = LocalDate.now().plusDays(1);LocalDate nextMonth =  LocalDate.now().plusMonths(1);

还有,我们在实战的时候往往要获取某一天的开始时间和当天所在月的第一天等。

LocalDate.now().atStartOfDay();LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());

LocalTime-如何获取时间

LocalTime和LocalDate类似,区别在于LocalDate不包含具体时间,而LocalTime包含具体时间。同样可以使用now或of方法来获得对象。

LocalTime localTime = LocalTime.now();

LocalTime oneTime = LocalTime.of(10,10,10);

LocalDate类似它也拥有parse、isBefore、获取时间单元等方法,就不再赘述。

需要注意的是,LocalTime获得的时间格式为:11:41:58.904。也就是,HH:mm:ss.nnn,这里nnn是纳秒。

还有一个在实战中查询日期区间时我们经常定义的“23:59:59.99”常量再也不用自己定义了。

// 23:59:59.999999999LocalTime maxTime = LocalTime.MAX;// 00:00LocalTime minTime = LocalTime.MIN;

LocalDateTime-日期和时间的组合

LocalDateTime表示日期和时间组合。可以通过of()方法直接创建,也可以调用LocalDate的atTime()方法或LocalTime的atDate()方法将LocalDate或LocalTime合并成一个LocalDateTime。

创建时间示例:

LocalDateTime now = LocalDateTime.now();

LocalDateTime oneTime = LocalDateTime.of(2019,10,14,10,12,12);

// 拼接日期LocalTime.now().atDate(LocalDate.now());

LocalDateTime与LocalDate和LocalTime之间可以相互转化。其他日期增减等操作与上面的类似。

Instant-获取时间戳

Instant用于一个时间戳,与System.currentTimeMillis()类似,但Instant可以精确到纳秒(Nano-Second)。

Instant除了可以使用now()方法创建,还可以通过ofEpochSecond方法创建。

Instant now = Instant.now();

Instant.ofEpochSecond(365 * 24 * 60, 100);

其中ofEpochSecond第一个参数表示秒,第二个参数表示纳秒。整体表示:从1970-01-01 00:00:00开始后的365天100纳秒的时间点。

Duration-获取时间段

Duration的内部实现与Instant类似,但Duration表示时间段,通过between方法创建。

LocalDateTime from = LocalDateTime.now();LocalDateTime to = LocalDateTime.now().plusDays(1);Duration duration = Duration.between(from, to);

// 区间统计换算// 总天数long days = duration.toDays();// 小时数long hours = duration.toHours();// 分钟数long minutes = duration.toMinutes();// 秒数long seconds = duration.getSeconds();// 毫秒数long milliSeconds = duration.toMillis();// 纳秒数long nanoSeconds = duration.toNanos();

Duration对象还可以通过of()方法创建,该方法参数为时间段长度和时间单位。

// 7天Duration duration1 = Duration.of(7, ChronoUnit.DAYS);// 60秒Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);

Period-获取日期段

Period与Duration类似,获取一个时间段,只不过单位为年月日,也可以通过of方法和between方法创建,between方法接收的参数为LocalDate。

Period period = Period.of(1, 10, 25);

Period period1 = Period.between(LocalDate.now(), LocalDate.now().plusYears(1));

ZonedDateTime-创建时区时间

ZonedDateTime类,用于处理带时区的日期和时间。ZoneId表示不同的时区。大约有40不同的时区。

获取所有时区集合:

Set allZoneIds = ZoneId.getAvailableZoneIds();

创建时区:

ZoneId zoneId = ZoneId.of("Asia/Shanghai");

把LocalDateTime转换成特定的时区:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);

另外和时区一起使用的类是OffsetDateTime类,OffsetDateTime是不变的,表示date-time偏移,存储所有日期和时间字段,精确至纳秒,从UTC/Greenwich计算偏移。

时间日期格式化

Java8对日期的格式化操作非常简单,首先看到上面的类大多都提供了parse方法,可以直接通过解析字符串得到对应的对象。

而日期和时间的格式化可通过LocalDateTime的format方法进行格式化。

LocalDateTime dateTime = LocalDateTime.now();String str = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);System.out.println(str);str = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));System.out.println(str);

可以使用DateTimeFormatter预置的格式,也可以通过DateTimeFormatter.ofPattern方法来指定格式。

关键点回顾

Java8中关于时间日期的API有以下关键点:

  • 提供了javax.time.ZoneId用来处理时区。

  • 提供了LocalDate与LocalTime类。

  • 时间与日期API中的所有类都是线程安全的。

  • 明确定义了基本的时间与日期概念。

  • 核心API:Instant、LocalDate、LocalTime、LocalDateTime、ZonedDateTime。

  • DateTimeFormatter类用于在Java中进行日期的格式化与解析。

好了,关于Java8新特性的时间日期功能就将到这里,用起来是不是简单明快多了,赶紧在项目中练练手吧。

感谢阅读,原创不易,喜欢就点个[在看] or [转发朋友圈],这是我写作最强的动力。

原创热门推荐?

1.【编程技术】Java8 Lambda表达式详解手册及实例

2.【软 实 力】成功,侥幸,以小博大?永远离不开的墨菲定律

3.【编程技术】Java8 Stream性能如何及评测工具推荐

4.【软 实 力】康威定律,作为架构师还不会灵活运用?

5.【编程技术】Java8 Stream新特性详解及实战

sqlserver获取前一天的日期_Java8新特性时间日期库DateTime API及示例相关推荐

  1. java instant获取微秒转成日期格式_Java8新特性时间日期库DateTime API及示例

    点击上方蓝字关注「程序新视界」 Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和Simp ...

  2. java system datetime_Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  3. java8 时间加一秒_java8 时间加一秒_java8新的时间日期库及使用示例

    来自:Java译站 链接:http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.ht ...

  4. Java 8中的时间日期库DateTime API及示例

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理 ...

  5. Java8时间日期库DateTime API及示例

    背景 Java对日期,日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全;还有用于格式化日期的类DateFor ...

  6. java8 lambda map排序_Java8新特性第3章(Stream API)

    转载请注明出处:https://zhuanlan.zhihu.com/p/20540202 Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStre ...

  7. java 8 新特性_Java8新特性Stream

    Stream (在阅读本文前,请务必掌握Lambda表达式以及方法引用的使用:Lambda表达式--方法引用,Java8新特性Lambda表达式,在本文的示例中,使用了大量的Lambda表达式). S ...

  8. Java 8新的时间日期库,这二十个案例看完你还学不会算我的!!!

    Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及 ...

  9. Java 8新的时间日期库的20个使用示例

    Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java ...

最新文章

  1. 苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
  2. 20应用统计考研复试要点(part31)--简答题
  3. mysql jpa总分数_JPA 查询COUNT示例
  4. 基于django rest framework的mock server实践
  5. 计算机应用类专业综合冲刺卷,2009年计算机应用类专业综合知识模拟试卷.doc
  6. mysql系列之6--------使用第三方工具-percona来备份mysql和恢复
  7. 2008 php mysql_windows 2008配置Nginx+PHP+Mysql
  8. 阮一峰ES6入门读书笔记(十一):Promise
  9. C语言 55555图形 找车牌问题
  10. “领导力培训”纪要整理
  11. Blast中文手册(5)
  12. QQ群 该页面暂时无法显示
  13. 论坛数据库设计 mysql_论坛数据库设计初步
  14. 统计学习方法-第十章
  15. K2 工作流_携手捷普:让流程立于云端,臻于至上_全球领先的工作流引擎
  16. 梦幻诛仙手游服务器信息失败,梦幻诛仙手游充值失败 元宝不到账解决办法
  17. 从算法上解读自动驾驶是如何实现的?
  18. 启动Tomcat报错- jar not loaded. Offending class: javax/servlet/Servlet.class
  19. php ucenter单点登录,UCenter的应用整合与单点登录分析
  20. 并发编程-两个线程交替操作

热门文章

  1. java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解
  2. linux home的权限,Linux中用户帐号和用户home目录
  3. NGINX---一次阿里云宝塔开发flask经历
  4. mysql 报错从 新安装
  5. 多语言 获取当前语言
  6. 从输入url开始,完善前端体系架构
  7. C# 设置Word文档背景(纯色/渐变/图片背景)
  8. matlab矩阵内存预分配
  9. nginx 平滑升级
  10. spring 计划任务