代码片段:基于 JDK 8 time包的时间工具类 TimeUtil
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!
“知识的工作者必须成为自己时间的首席执行官。”
前言
这次泥瓦匠带来的是一个好玩的基于 JDK 8 time包的时间工具类 TimeUtil。本意,用 JDK 8 写个实战的时间工具类,初版泥瓦匠写的很不好,后来雨神分分钟将这个代码优化优化,谢谢雨神。就此分享下这个代码,让更多的人看到~
一、 Java 8 time包
从 Java 1.0 有个 Date 类,想必大家不陌生,后面有了 Calendar 类(被废弃 )。API 确实比较难用,因此 Java 8 引入 java.time API,这次看看是不是很好用。大致引入了这几个对象:
- Instant – 瞬间类,表示时间线上的一点(与 Date 类似)
- Duration – 持续时间,表示两个 Instant 之间的时间
- LocalDateTime – 本地日期时间,表示一个日期和时间。
本小文重点还是在使用 LocalDateTime 及其格式化类 DateTimeFormatter。
二、介绍 LocalDateTime & DateTimeFormatter APIs
LocalDateTime 表示一个日期和时间,存储确定时区中的某个时间点。
例如某一次练书法弹琴活动。(ps:泥瓦匠有个小圈子,里面喜欢加入一些文艺的程序员。爱技术,爱生活,爱艺术~ 雨神就爱弹琴,日语思密达*&#@#% )
常用api:
- now()
从系统中获取当前时间 - parse(CharSequence text, DateTimeFormatter formatter)
从字符串按格式获取 LocalDateTime 实例
DateTimeFormatter 用于格式化时间,提供了公用的方法入口,打印和解析格式化的时间类。
常用api:
- format(TemporalAccessor temporal)
按格式格式化时间 - ofPattern(String pattern)
按字符串指定的格式,生成时间格式
三、TimeUtil 代码详解
泥瓦匠一一道来这个代码的实现。先看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * 基于 JDK 8 time包的时间工具类 * <p/> * Created by bysocket on 16/8/23. */ public final class TimeUtil { /** * 获取默认时间格式: yyyy-MM-dd HH:mm:ss */ private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter; private TimeUtil() { // no construct function } /** * String 转时间 * * @param timeStr * @return */ public static LocalDateTime parseTime(String timeStr) { return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER); } /** * String 转时间 * * @param timeStr * @param format 时间格式 * @return */ public static LocalDateTime parseTime(String timeStr, TimeFormat format) { return LocalDateTime.parse(timeStr, format.formatter); } /** * 时间转 String * * @param time * @return */ public static String parseTime(LocalDateTime time) { return DEFAULT_DATETIME_FORMATTER.format(time); } /** * 时间转 String * * @param time * @param format 时间格式 * @return */ public static String parseTime(LocalDateTime time, TimeFormat format) { return format.formatter.format(time); } /** * 获取当前时间 * * @return */ public static String getCurrentDatetime() { return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now()); } /** * 获取当前时间 * * @param format 时间格式 * @return */ public static String getCurrentDatetime(TimeFormat format) { return format.formatter.format(LocalDateTime.now()); } /** * 时间格式 */ public enum TimeFormat { /** * 短时间格式 */ SHORT_DATE_PATTERN_LINE( "yyyy-MM-dd" ), SHORT_DATE_PATTERN_SLASH( "yyyy/MM/dd" ), SHORT_DATE_PATTERN_DOUBLE_SLASH( "yyyy\\MM\\dd" ), SHORT_DATE_PATTERN_NONE( "yyyyMMdd" ), /** * 长时间格式 */ LONG_DATE_PATTERN_LINE( "yyyy-MM-dd HH:mm:ss" ), LONG_DATE_PATTERN_SLASH( "yyyy/MM/dd HH:mm:ss" ), LONG_DATE_PATTERN_DOUBLE_SLASH( "yyyy\\MM\\dd HH:mm:ss" ), LONG_DATE_PATTERN_NONE( "yyyyMMdd HH:mm:ss" ), /** * 长时间格式 带毫秒 */ LONG_DATE_PATTERN_WITH_MILSEC_LINE( "yyyy-MM-dd HH:mm:ss.SSS" ), LONG_DATE_PATTERN_WITH_MILSEC_SLASH( "yyyy/MM/dd HH:mm:ss.SSS" ), LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH( "yyyy\\MM\\dd HH:mm:ss.SSS" ), LONG_DATE_PATTERN_WITH_MILSEC_NONE( "yyyyMMdd HH:mm:ss.SSS" ); private transient DateTimeFormatter formatter; TimeFormat(String pattern) { formatter = DateTimeFormatter.ofPattern(pattern); } } } |
工具类由 final TimeUtil类 及 其内部枚举类TimeFormat时间格式类 组成。
1/ TimeUtil 具有私有构造函数,表示被保护,无法被外部 new 出实例。
声明了默认的 DateTimeFormatter 时间格式:yyyy-MM-dd HH:mm:ss。其他则是提供了 获取当前时间 和 时间与String互转的方法。
2/ TimeFormat 内部枚举类,首先它是单例的。
transient 关键字目的是确保 DateTimeFormatter 无序列化存储。为啥单例,因为 DateTimeFormmatter 是无状态的,可以线程共享。
具体方法解析如下:
1. 获取当前时间
1
2
3
4
|
String now = TimeUtil.getCurrentDatetime(); System.out.println(now); output: 2016 - 08 - 28 16 : 35 : 23 |
2. 获取当前相应格式的当前时间
1
2
3
4
|
String now = TimeUtil.getCurrentDatetime(TimeUtil.TimeFormat.LONG_DATE_PATTERN_SLASH); System.out.println(now); output: 2016 / 08 / 28 16 : 36 : 24 |
3. String 转时间
默认格式:yyyy-MM-dd HH:mm:ss
1
2
3
|
LocalDateTime expectedDateTime = LocalDateTime.of( 2014 , 11 , 11 , 10 , 11 , 11 ); LocalDateTime parsedTime = TimeUtil.parseTime( "2014-11-11 10:11:11" ); assertEquals(expectedDateTime, parsedTime); |
其他格式之一:yyyy-MM-dd HH:mm:ss
1
2
3
|
LocalDateTime expectedDateTime = LocalDateTime.of( 2014 , 11 , 11 , 10 , 11 , 11 ); LocalDateTime parsedTime = TimeUtil.parseTime( "2014/11/11 10:11:11" , LONG_DATE_PATTERN_SLASH); assertEquals(expectedDateTime, parsedTime); |
4. 时间转 String
默认格式:yyyy-MM-dd HH:mm:ss
1
2
|
LocalDateTime time = LocalDateTime.of( 2014 , 11 , 11 , 10 , 11 , 11 ); assertEquals(TimeUtil.parseTime(time), "2014-11-11 10:11:11" ); |
其他格式之一:yyyy-MM-dd HH:mm:ss
1
2
|
LocalDateTime time = LocalDateTime.of( 2014 , 11 , 11 , 10 , 11 , 11 ); assertEquals(TimeUtil.parseTime(time, LONG_DATE_PATTERN_DOUBLE_SLASH), "2014\\11\\11 10:11:11" ); |
四、与 Old 代码互操作
java.time 类与 Old Date 代码互操作如下图:
五、小结
实战中的 JDK8 ,Show the code。 在用的项目,完善测试时候用起来才是关键。自然需要 JDK 环境支持,升级吧升级吧。
基于 JDK 8 time包的实践,这次只讲了 LocalDateTime 类,慢慢带来更多。
相关代码分享在 Github 主页
如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。
代码片段:基于 JDK 8 time包的时间工具类 TimeUtil的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 基于Java8的日期时间工具类DateTimeFormatter
原文:https://blog.csdn.net/qq_36596145/article/details/85331002 import java.time.Instant; import java. ...
- 基于jdk1.7实现的excel导出工具类
通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Zip包解压工具类
最近在做项目的自动检测离线升级,使用到了解压zip包的操作,本着拿来主义精神,搞了个工具类(同事那边拿的),用着还不错. package com.winning.polaris.admin.utils ...
- 基于HttpClient4.5.2实现的HttpClient工具类
1.maven依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>co ...
随机推荐
- js call
转载地址:http://www.cnblogs.com/sweting/archive/2009/12/21/1629204.html call 方法 请参阅 应用于:Function 对象 要求 版 ...
- 常用的sql语言基础(1)
数据文件:存放数据不能随便删除查看数据方式:select name from v$datafile;select file_name from dba_data_file; 控制文件:是一个二进制文件 ...
- Nim教程【一】
这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...
- 西安.NET俱乐部群 推广代码
CSS: .gallery-item { display:inline-block; margin: 15px; } 个人签名: <div class="gallery&quo ...
- 菜鸟日记-HTML-表格与表单
一.表格 <table></table> width:宽度.可以用像素或百分比表示. border:边框,常用值0 cellpadding:内容跟单元格边框的边距.常用值0 a ...
- 解决用navicate远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes
在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); GRANT ALL PRIVILEGES ON *.* ...
- 智能配置item
iTerm配置说明 ==== **这是一个很智能的配置,不论你电脑里面有没有安装iTerm,不管你有没有.zshrc配置文件,git配置文件,git忽略文件,以及git的默认编辑器都已经更改为vim, ...
- Leetcode-237 Delete Node in a Linked List
#237. Delete Node in a Linked List Write a function to delete a node (except the tail) in a singl ...
- 炜煌T3POS58微打参数设置方法
本文用菊子曰发布
- 从零开始编写自己的C#框架 ---- 系列文章
目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...