1.  Java 8 日期处理新特性

  Java 8基于ISO标准日期系统,提供了java.time包来处理时间日期,且该包下的所有类都是不可变类型而且线程安全。

2.  关键类

  • Instant:瞬时实例。
  • LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
  • LocalTime:本地时间,不包含日期。
  • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
  • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
  新API还引入了 ZoneOffSet 和 ZoneId 类,解决时区问题。
  对用于解析和格式化时间的 DateTimeFormatter 类也进行了优化。

3.  示例代码

  1 import java.time.Clock;
2 import java.time.Instant;
3 import java.time.LocalDate;
4 import java.time.LocalDateTime;
5 import java.time.LocalTime;
6 import java.time.Month;
7 import java.time.MonthDay;
8 import java.time.OffsetDateTime;
9 import java.time.Period;
10 import java.time.Year;
11 import java.time.YearMonth;
12 import java.time.ZoneId;
13 import java.time.ZoneOffset;
14 import java.time.ZonedDateTime;
15 import java.time.format.DateTimeFormatter;
16 import java.time.temporal.ChronoUnit;
17 import java.util.Date;
18
19 import org.junit.Test;
20
21 /**
22 * Java 8 日期时间单元测试
23 *
24 * @author CL
25 *
26 */
27 public class TestDateTime {
28
29 /**
30 * 测试当前时间
31 */
32 @Test
33 public void testCurrentDate() {
34 LocalDate localDate = LocalDate.now();
35 System.out.printf("当前时间(不包含时间): %s \n", localDate);
36
37 Date date = new Date();
38 System.out.printf("当前时间(包含时间): %s \n", date);
39 }
40
41 /**
42 * 测试详细日期,获取年、月、日
43 */
44 @Test
45 public void testDetailsDate() {
46 LocalDate today = LocalDate.now();
47 int year = today.getYear();
48 int month = today.getMonthValue();
49 int day = today.getDayOfMonth();
50 System.out.printf("今天是:%s 年 %s 月 %s 日", year, month, day);
51 }
52
53 /**
54 * 测试特殊日期
55 */
56 @Test
57 public void testSpecialDate() {
58 LocalDate specialDate = LocalDate.of(2018, 5, 12);
59 System.out.printf("%s 是个特殊的日子!", specialDate);
60 }
61
62 /**
63 * 测试周期日期
64 */
65 @Test
66 public void testCalculationDate() {
67 LocalDate today = LocalDate.now();
68 LocalDate laborDay = LocalDate.of(2020, 5, 1);
69
70 MonthDay currMonthDay = MonthDay.from(today);
71 MonthDay laborMonthDay = MonthDay.of(laborDay.getMonthValue(), laborDay.getDayOfMonth());
72
73 if (currMonthDay.equals(laborMonthDay)) {
74 System.out.println("今天是劳动节!");
75 } else {
76 System.out.println("今天不是劳动节!");
77 }
78 }
79
80 /**
81 * 测试当前时间
82 */
83 @Test
84 public void testCurrentTime() {
85 LocalTime localTime = LocalTime.now();
86 System.out.printf("当前时间是:%s", localTime);
87 }
88
89 /**
90 * 测试当前日期时间
91 */
92 @Test
93 public void testCurrentDateTime() {
94 LocalDateTime localDateTime = LocalDateTime.now();
95 System.out.printf("当前日期时间是:%s", localDateTime);
96 }
97
98 /**
99 * 测试加减日期时间
100 */
101 @Test
102 public void testMinusPlusDateTime() {
103 LocalDate localDate = LocalDate.now();
104 LocalTime localTime = LocalTime.now();
105 System.out.printf("两小时前的时间是:%s \n", localTime.minusHours(2L));
106 System.out.printf("两小时后的时间是:%s \n", localTime.plusHours(2L));
107 System.out.printf("一周前的日期是:%s \n", localDate.minus(1L, ChronoUnit.WEEKS));
108 System.out.printf("一周后的日期是:%s \n", localDate.plus(1L, ChronoUnit.WEEKS));
109 System.out.printf("一年前的日期是:%s \n", localDate.minus(1L, ChronoUnit.YEARS));
110 System.out.printf("一年后的日期是:%s \n", localDate.plus(1L, ChronoUnit.YEARS));
111 }
112
113 /**
114 * 测试时钟类
115 */
116 @Test
117 public void testClock() {
118 // 根据系统时间返回当前UTC
119 Clock systemUTC = Clock.systemUTC();
120 System.out.printf("当前UTC: %s \n", systemUTC);
121
122 // 根据系统时区返回当前时区
123 Clock systemDefaultZone = Clock.systemDefaultZone();
124 System.out.printf("当前时区: %s \n", systemDefaultZone);
125 }
126
127 /**
128 * 测试判断是否为前后日期
129 */
130 @Test
131 public void testBeforeOrAfterDate() {
132 LocalDate today = LocalDate.now();
133
134 LocalDate yesterday = today.minus(1L, ChronoUnit.DAYS);
135 if (yesterday.isBefore(today)) {
136 System.out.printf("%s 是今天之前的日期! \n", yesterday);
137 }
138
139 LocalDate tomorrow = today.plus(1L, ChronoUnit.DAYS);
140 if (tomorrow.isAfter(today)) {
141 System.out.printf("%s 是今天之后的日期! \n", tomorrow);
142 }
143 }
144
145 /**
146 * 测试指定时区日期时间
147 */
148 @Test
149 public void testZoneTime() {
150 LocalDateTime localDateTime = LocalDateTime.now();
151
152 ZoneId america = ZoneId.of("America/New_York");
153 ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, america);
154 System.out.printf("当前日期时间在指定时区的日期时间为: %s", zonedDateTime);
155 }
156
157 /**
158 * 测试具体时区时间
159 */
160 @Test
161 public void testZoneOffset() {
162 LocalDateTime localDateTime = LocalDateTime.of(Year.now().getValue(), Month.FEBRUARY, 1, 12, 30);
163 ZoneOffset zoneOffset = ZoneOffset.of("+08:00");
164
165 OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, zoneOffset);
166 System.out.printf("与当前时区指定时间相差8小时的时区时间为:%s", offsetDateTime);
167 }
168
169 /**
170 * 测试天数
171 */
172 @Test
173 public void testLengDays() {
174 YearMonth yearMonth = YearMonth.now();
175 System.out.printf("今天是 %s 年 %s 月,本年共有 %s 天,本月共有 %s 天", yearMonth.getYear(), yearMonth.getMonthValue(),
176 yearMonth.lengthOfYear(), yearMonth.lengthOfMonth());
177 }
178
179 /**
180 * 测试闰年
181 */
182 @Test
183 public void testLeapYear() {
184 LocalDate today = LocalDate.now();
185 if (today.isLeapYear()) {
186 System.out.printf("%s 年是闰年!", today.getYear());
187 } else {
188 System.out.printf("%s 年不是闰年!", today.getYear());
189 }
190 }
191
192 /**
193 * 测试计算时间间隔天数
194 */
195 @Test
196 public void testCalcDays() {
197 LocalDate today = LocalDate.now();
198 LocalDate nextWeek = today.plus(1L, ChronoUnit.WEEKS);
199 LocalDate nextMonth = today.plus(1L, ChronoUnit.MONTHS);
200 LocalDate nextYear = today.plus(1L, ChronoUnit.YEARS);
201 LocalDate anyDate = LocalDate.of(2022, 8, 8);
202
203 Period periodOfNextWeek = Period.between(today, nextWeek);
204 System.out.printf("%s 和 %s 之间距离 %s 年 %s 月 %s 天 \n", today, nextWeek, periodOfNextWeek.getYears(),
205 periodOfNextWeek.getMonths(), periodOfNextWeek.getDays());
206
207 Period periodOfNextMonth = Period.between(today, nextMonth);
208 System.out.printf("%s 和 %s 之间距离 %s 年 %s 月 %s 天 \n", today, nextWeek, periodOfNextMonth.getYears(),
209 periodOfNextMonth.getMonths(), periodOfNextMonth.getDays());
210
211 Period periodOfNextYear = Period.between(today, nextYear);
212 System.out.printf("%s 和 %s 之间距离 %s 年 %s 月 %s 天 \n", today, nextWeek, periodOfNextYear.getYears(),
213 periodOfNextYear.getMonths(), periodOfNextYear.getDays());
214
215 Period periodOfAnyDate = Period.between(today, anyDate);
216 System.out.printf("%s 和 %s 之间距离 %s 年 %s 月 %s 天 \n", today, anyDate, periodOfAnyDate.getYears(),
217 periodOfAnyDate.getMonths(), periodOfAnyDate.getDays());
218 }
219
220 /**
221 * 测试当前时间戳
222 */
223 @Test
224 public void testTimestamp() {
225 Instant timestamp = Instant.now();
226 System.out.printf("当前时间戳是:%s", timestamp);
227 }
228
229 /**
230 * 测试格式化日期时间
231 */
232 @Test
233 public void testFormatDateTime() {
234 String date = "20080808";
235 LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE);
236 System.out.printf("%s 格式化后为: %s \n", date, localDate);
237
238 String dateTime = "2020-01-01T12:30";
239 LocalDateTime localDateTime = LocalDateTime.parse(dateTime, DateTimeFormatter.BASIC_ISO_DATE);
240 System.out.printf("%s 格式化后为: %s \n", dateTime, localDateTime);
241 }
242 }

Java 8 新特性:日期处理的更多相关文章

  1. Java 8 新特性:Lambda、Stream和日期处理

    1. Lambda 简介   Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstract ...

  2. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  3. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  4. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  5. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  6. Java 8 新特性-菜鸟教程 (0) -Java 8 新特性

    Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 ...

  7. Java-Runoob-高级课程:Java 8 新特性

    ylbtech-Java-Runoob-高级课程:Java 8 新特性 1.返回顶部 1. Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Or ...

  8. Java 8 新特性终极指南

    1.前言 毫无疑问,Java 8的发布是自从Java5以来Java世界中最重大的事件,它在编译器.工具类和Java虚拟机等方面为Java语言带来的很多新特性.在本文中我们將一起关注下这些新变化,使用实 ...

  9. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  10. Java 8新特性解读

    (四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...

随机推荐

  1. 2020CCPC长春题解 I - Kawaii Courier

    2020CCPC长春题解 I - Kawaii Courier 题目大意:给一个树,让你求每个节点走到根节点的期望的d*x^d,d为走过的边个数.走法是每次随机等概率走到相邻的点. 题目分析: 相对于 ...

  2. php 抛出异常

    <?php //try里面执行的东西如果不成立,可直接 throw new Exception('异常信息'),那么try里面的程序将会被停止执行,直接执行catch里面的程序 try { if ...

  3. 需要登录才能下载的文件可以用Folx下载吗

    用苹果电脑的小伙伴有没有发现,有时候文件即时有下载链接也还是要先登录才能下载,那这样的文件用下载器Folx还能下载码?下面小编将在Mac系统平台上,通过一篇教程教大家利用Folx 5的密码管理来保存网 ...

  4. 【模版】【P3806】点分治

    (7.17)早就想学点分治了--今天状态不太在线,眯一会写篇笔记来理理思路. ------------------------------------------------------------- ...

  5. [BUGCASE]Phantom服务代码不健壮导致无法发送报表邮件

    一.问题描述 广告平台中的发报表邮件功能偶尔会出现发送失败的情况,重启phantom服务之后就好了 查看phantom服务的日志发现,在2017-12-12 03:29:45有访问记录,并且参数是异常 ...

  6. 深度学习论文翻译解析(十五):Densely Connected Convolutional Networks

    论文标题:Densely Connected Convolutional Networks 论文作者:Gao Huang Zhuang Liu Laurens van der Maaten  Kili ...

  7. 这些鲜为人知的前端冷知识,你都GET了吗?

    背景 最近公司项目不多,比较清闲,划水摸鱼混迹于各大技术博客平台,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来,不由的发出一声感叹! 前端可真是博大精深 于是 ...

  8. Prometheus 使用之 node exporter

    本文使用的 Prometheus 版本为 2.22.0,node exporter 版本为 1.0.1:部署在 Linux 服务器Prometheus 是开源的监控报警系统和时序列数据库 (TSDB) ...

  9. 如何将图片、html等格式转成pdf

    const int WWidth = 600; const int HHeight = 800; List<System.Drawing.Image> AllName = new List ...

  10. sitespeedio前端性能测试工具介绍

    很久没有写博客了,今天给大家介绍一款比较好用的前端性能测试工具. sitespeedio简介: sitespeed.io是Jonathan Lee发布的一款可监视和衡量网站前端性能的开源工具. 1.开 ...