Java代码片段工具篇之DatePatternEnum API

举报
西魏陶渊明 发表于 2022/09/25 05:58:00 2022/09/25
【摘要】 作为开发者,每个开发项目中一定有很多的工具类,而其中百分之六七十就有一个DateUtils工具。每次都要写日期格式,yyyyMMdd。每个项目项目中使用的日期格式都不一样。终于有一天,一堆程序猿受不了...

作为开发者,每个开发项目中一定有很多的工具类,而其中百分之六七十就有一个DateUtils工具。每次都要写日期格式,yyyyMMdd。每个项目项目中使用的日期格式都不一样。终于有一天,一堆程序猿受不了了。于是把所有的日期格式都写完。放到一个工具里。使用就完了。文尾提供代码。欢迎收藏使用。

一、JDK中DateTimeFormatter与SimpleDateFormat的区别

旧版的API存在线程安全的问题,所谓线程安全问题,只会存在在多线程场景下。当多个线程对同一个对象的,属性进行修改时候,就很大几率会产生数据不同步问题,举一个简单的例子: A线程看到门外有一个人是小明,然后准备开门让小明进来时候,B线程把小明拉走了,让小张站门外了。结果导致A开门原本准备让小明进来,结果开门小张进来了。SimpleDateFormat的问题就是这样。format方法时候会将属性改变从而导致线程安全。因为现在建议使用新的日期API来替换老的。

二、 DatePatternEnum API

线程安全,使用简单,效率更高

DatePatternEnum API

index pattern desc enum example
0 yyyy-MM-dd HH:mm:ss 年月日时分秒 DATE_TIME_PATTERN 2019-11-04 17:06:18
1 HH:mm:ss 时分秒 TIME_PATTERN 17:06:18
2 yyyy-MM-dd HH:mm 年月日时分 MINUTE_PATTERN 2019-11-04 17:06
3 yyyy-MM-dd 年月日 DATE_PATTERN 2019-11-04
4 yyyy-MM 年月 MONTH_PATTERN 2019-11
5 yyyy YEAR_ONLY_PATTERN 2019
6 MM MONTH_ONLY_PATTERN 11
7 dd DAY_ONLY_PATTERN 04
8 HH HOUR_ONLY_PATTERN 17
9 mm MINUTE_ONLY_PATTERN 06
10 ss SECOND_ONLY_PATTERN 18
11 yyyy年MM月dd日 HH时mm分ss秒 中文格式年月日时分秒 ZN_DATE_TIME_PATTERN 2019年11月04日 17时06分18秒
12 yyyy年MM月dd日 中文格式年月日 ZN_DATE_PATTERN 2019年11月04日
13 yyyy年MM月 中文格式年月 ZN_MONTH_PATTERN 2019年11月
14 yyyy年 中文格式年 ZN_YEAR_ONLY_PATTERN 2019年
15 HH时mm分ss秒 时分秒 ZN_TIME_PATTERN 17时06分18秒
16 yyyyMMddHHmmss 无间隔的年月日时分秒 GAP_LESS_DATE_TIME_PATTERN 20191104170618
17 yyyyMMdd 无间隔的年月日 GAP_LESS_DATE_PATTERN 20191104
18 yyyy-MM-dd HH:mm:ss.SSS 精确到毫秒 DATE_TIME_MS_PATTERN 2019-11-04 17:06:18.420

三、Code Example


对日期的处理,首先是模板,枚举内提供了常用的日期模板,使用时候无需自己生成 SimpleDateFormat 或者是
DateTimeFormatter
每个日期模板都可以直接调用 format (Date转String) 或者 parse (String转Date)

//①返回当前日期格式化的文本,日期表达式: DATE_TIME_PATTERN = 'yyyy-MM-dd HH:mm:ss'
System.out.println(DatePatternEnum.DATE_TIME_PATTERN.format());

//②返回当前日期格式化的文本,日期表达式: DATE_TIME_PATTERN = 'yyyy年MM月dd日 HH时mm分ss秒'
System.out.println(DatePatternEnum.ZN_DATE_TIME_PATTERN.format());

//③返回入参指定日期格式化的文本
System.out.println(DatePatternEnum.DATE_TIME_PATTERN.format(new Date()));

//④返回日期格式化工具
SimpleDateFormat dateFormat = DatePatternEnum.TIME_PATTERN.getDateFormat();

//⑤返回新JDK日期格式化工具
DateTimeFormatter dateTimeFormatter = DatePatternEnum.TIME_PATTERN.getFormatter();

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

四、完整代码

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * 年-月-日 时:分:秒.毫秒->2019-11-05 17:43:29.383
 * 年-月-日 时:分:秒->2019-11-05 17:43:29
 * 时:分:秒->17:43:29
 * 年-月-日 时:分->2019-11-05 17:43
 * 年-月-日->2019-11-05
 * 年-月->2019-11
 * 年->2019
 * 月->11
 * 日->05
 * 时->17
 * 分->43
 * 秒->29
 * 中文格式年月日时分秒毫秒->2019年11月05日 17时43分29秒386毫秒
 * 中文格式年月日时分秒->2019年11月05日 17时43分29秒
 * 中文格式年月日->2019年11月05日
 * 中文格式年月->2019年11月
 * 中文格式年->2019年
 * 中文格式时分秒->17时43分29秒
 * 无间隔符的年月日时分秒->20191105174329
 * 无间隔符的年月日时分秒毫秒->20191105174329387
 * 无间隔符的年月日->20191105
 *
 * @author liuxin
 */
public enum DatePatternEnum {

    DATE_TIME_MS_PATTERN(0, "yyyy-MM-dd HH:mm:ss.SSS", "年-月-日 时:分:秒.毫秒"),

    DATE_TIME_PATTERN(1, "yyyy-MM-dd HH:mm:ss", "年-月-日 时:分:秒"),

    TIME_PATTERN(2, "HH:mm:ss", "时:分:秒"),

    MINUTE_PATTERN(3, "yyyy-MM-dd HH:mm", "年-月-日 时:分"),

    DATE_PATTERN(4, "yyyy-MM-dd", "年-月-日"),

    MONTH_PATTERN(5, "yyyy-MM", "年-月"),

    ONLY_YEAR_PATTERN(6, "yyyy", "年"),

    ONLY_MONTH_PATTERN(7, "MM", "月"),

    ONLY_DAY_PATTERN(8, "dd", "日"),

    ONLY_HOUR_PATTERN(9, "HH", "时"),

    ONLY_MINUTE_PATTERN(10, "mm", "分"),

    ONLY_SECOND_PATTERN(11, "ss", "秒"),

    ZN_DATE_TIME_MS_PATTERN(12, "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒", "中文格式年月日时分秒毫秒"),

    ZN_DATE_TIME_PATTERN(13, "yyyy年MM月dd日 HH时mm分ss秒", "中文格式年月日时分秒"),

    ZN_DATE_PATTERN(14, "yyyy年MM月dd日", "中文格式年月日"),

    ZN_MONTH_PATTERN(15, "yyyy年MM月", "中文格式年月"),

    ZN_YEAR_ONLY_PATTERN(16, "yyyy年", "中文格式年"),

    ZN_TIME_PATTERN(17, "HH时mm分ss秒", "中文格式时分秒"),

    GAP_LESS_DATE_TIME_PATTERN(18, "yyyyMMddHHmmss", "无间隔符的年月日时分秒"),

    GAP_LESS_DATE_TIME_MS_PATTERN(19, "yyyyMMddHHmmssSSS", "无间隔符的年月日时分秒毫秒"),

    GAP_LESS_DATE_PATTERN(20, "yyyyMMdd", "无间隔符的年月日");


    private int index;

    private String pattern;

    private String desc;

    private static final Map<DatePatternEnum, SimpleDateFormat> formatCache = new WeakHashMap<>(initialCapacity());

    private static final Map<DatePatternEnum, DateTimeFormatter> formatterCache = new WeakHashMap<>(initialCapacity());

    static {
        checkCache();
    }

    //一个数如果是奇数的话,那么他的二进制最后一位一定为1,如果为奇数+1返回
    private static int initialCapacity() {
        return (values().length & 1) == 1 ? values().length + 1 : values().length;
    }

    private static void checkCache() {
        if (formatCache.isEmpty() || formatCache.size() != values().length) {
            formatCache.clear();
            for (DatePatternEnum datePatternEnum : values()) {
                formatCache.put(datePatternEnum, new SimpleDateFormat(datePatternEnum.getPattern()));
            }
        }
        if (formatterCache.isEmpty() || formatterCache.size() != values().length) {
            formatterCache.clear();
            for (DatePatternEnum datePatternEnum : values()) {
                formatterCache.put(datePatternEnum, DateTimeFormatter.ofPattern(datePatternEnum.getPattern()));
            }
        }
    }

    DatePatternEnum(int index, String pattern, String desc) {
        this.index = index;
        this.pattern = pattern;
        this.desc = desc;
    }

    public int getIndex() {
        return index;
    }

    public String getPattern() {
        return pattern;
    }

    public String getDesc() {
        return desc;
    }

    public DateTimeFormatter getFormatter() {
        checkCache();
        return formatterCache.getOrDefault(this, DateTimeFormatter.ofPattern(getPattern()));
    }

    private SimpleDateFormat getUnSafeDateFormat() {
        checkCache();
        return formatCache.getOrDefault(this, new SimpleDateFormat(getPattern()));
    }

    public String format() {
        return LocalDateTime.now().format(getFormatter());
    }

    public String format(Date date) {
        assert date != null;
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).format(getFormatter());
    }

    public Date parse(String dateText) throws Exception {
        return getUnSafeDateFormat().parse(dateText);
    }

}

  
 
  • 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
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/105872279

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。