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. java~通过springloaded实现热部署

    之前写过使用自定义的classLoader进行动态加载,热部署:它有很多弊端,我总结一下: 当前项目不能引用第三方包 当前项目必须使用反射的方式调用第三方包的方法 写死的一些路径 springload ...

  2. springboot项目启动报错Communications link failure

    环境情况,MySQL版本如下: 报错情况如下(看上去是和数据库有关): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communi ...

  3. 如何使用ABBYY FineReader 处理无法识别的字符?

    在识别PDF文档时,我们可能会遇到文档中存在多种语言.多种不同类型文字字符的情况.在ABBYY FineReader 15(Windows系统)OCR文字识别软件的默认语言数据下,可能无法识别PDF文 ...

  4. 在FL Studio中如何做出渐入的人声效果

    当我们在拿到一段人声并想把它加入歌曲中时,如果我们发现人声没有渐入的效果,直接加入到歌曲里出现会变得很突兀的话,我们就需要用到这篇文章所介绍的方法,给人声加上一个渐入的效果. 1. 找到我们需要处理的 ...

  5. Windows10通过NFS挂载linux目录

    大致分为以下三大步骤: 一.启动NFS服务器 二.启动NFS客户端 三.挂载NFS目录 工具: win10.虚拟机Ubuntu18.0系统 一. 启动linux的NFS服务端: 以下均为Ubuntu操 ...

  6. Linux 上如何清除 RAM 内存高速缓存,缓存和交换空间

    像任何其他的操作系统一样,GNU / Linux已经有效地实施了内存管理甚至更多.但是,如果有任何进程正在蚕食你的内存,你要清除它,Linux提供了一个方法来刷新或清除RAM缓存. 在Linux中如何 ...

  7. Hybrid接口应用

    简介:VLAN10内通信,VLAN20内通信,VLAN30与VLAN10.VLAN20.VLAN30皆可通信 Hybrid接口应用拓扑图: 一.配置PC机 ip 并测试相互能否ping通 PC名称 I ...

  8. 以前一个个文件删数据的我,今天终于找到了释放C盘空间的办法

    这是我刚刚清理的C盘,亲测有效!无需安装清理空间的软件,我的电脑品牌是华硕. win10的电脑应该都有搜索功能,如果没有开启,可以鼠标右键点击任务栏. 弹出菜单找到[搜索]-[显示搜索图标],勾选即可 ...

  9. 创建实验楼课程app模块以及配置图片路径

    1.创建course模型 1.1 创建用户模型course python ../manage.py startapp course # 创建course模型 1.2 在setting.py中注册cou ...

  10. 树莓派搭建seafile服务器备忘

    用户:pi 密码:raspberry 启用root用户https://blog.csdn.net/chenxd1101/article/details/53437925(防止特殊原因pi用户不能登录时 ...