代码片段:基于 JDK 8 time包的时间工具类 TimeUtil

时间:2022-06-20 10:18:47

摘要: 原创出处: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 代码互操作如下图:

代码片段:基于 JDK 8 time包的时间工具类 TimeUtil

五、小结

实战中的 JDK8 ,Show the code。 在用的项目,完善测试时候用起来才是关键。自然需要 JDK 环境支持,升级吧升级吧。
基于 JDK 8 time包的实践,这次只讲了 LocalDateTime 类,慢慢带来更多。
相关代码分享在 Github 主页

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

代码片段:基于 JDK 8 time包的时间工具类 TimeUtil的更多相关文章

  1. Go&sol;Python&sol;Erlang编程语言对比分析及示例 基于RabbitMQ&period;Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog&plus;NLog&period;Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C&num; B&sol;S 、C&sol;S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  2. 封装一个基于NLog&plus;NLog&period;Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  3. 封装一个基于NLog&plus;NLog&period;Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  4. 基于Java8的日期时间工具类DateTimeFormatter

    原文:https://blog.csdn.net/qq_36596145/article/details/85331002 import java.time.Instant; import java. ...

  5. 基于jdk1&period;7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  6. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

  7. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  8. Zip包解压工具类

    最近在做项目的自动检测离线升级,使用到了解压zip包的操作,本着拿来主义精神,搞了个工具类(同事那边拿的),用着还不错. package com.winning.polaris.admin.utils ...

  9. 基于HttpClient4&period;5&period;2实现的HttpClient工具类

    1.maven依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>co ...

随机推荐

  1. &lbrack;LeetCode&rsqb; Water and Jug Problem 水罐问题

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...

  2. js获取文件大小

    var file = urlBox.doc.activeElement.files[0]||urlBox.files[0] ; if (file) { var fileSize = 0; if (fi ...

  3. javascript 传递引用类型参数

    JavaScript代码如下: function setName(obj){ obj.name = "test1"; obj = new Object(); obj.name = ...

  4. 理解C&num;系列 &sol; 结束

    结束 开始写的原因 因为不知道自己有多牛. 因为需要一个备忘录. 因为要把知识梳理清楚,以便机器学习. 结束写的原因 因为想知道自己有多牛,不是把知识统统都摆出来,而是运用知识去做出东西来. 即将开发 ...

  5. 利用android studio gsonformat插件快速解析复杂json

    在android开发过程中,难免会遇到json解析,在这篇文章中为你快速解析复杂的json. 首先,在android studio中安装gsonformat插件. 点击File->Setting ...

  6. windows2012 IIS8&period;5 不能在此路径中使用此配置节

    IIS 8.5 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 o ...

  7. HDOJ 1058 Humble Numbers&lpar;打表过&rpar;

    Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The ...

  8. 初步了解PE分析

    尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...

  9. 五&period;HashTable原理及实现学习总结

    有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相对应的valu ...

  10. leetcode - &lbrack;4&rsqb;Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 思路:采用归并排序或者快速排序 #include < ...