Java日期时间API系列33

Wesley13
• 阅读 610

  从Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter中可以知道常用字符有超过20几种,各种组合结果非常多。但常用的组合就几十种,现在在 xk-time的原有模板中增加了Excel常用格式,方便大家使用。

直接看下代码:

package com.xkzhangsan.time.formatter; /** * 日期格式化常用模板 * * @author xkzhangsan * @date 2020年5月23日 */ public class DateFormatPattern { private DateFormatPattern(){ } // ==================================yyyy-MM-dd相关Pattern==================================

/\*\* \* yyyy-MM-dd 比如:  2020-05-23 \*/
public static final String YYYY\_MM\_DD = "yyyy-MM-dd"; /\*\* \* yyyy-M-d 不补0 比如:  2020-5-23 \*/
public static final String YYYY\_M\_D = "yyyy-M-d"; /\*\* \* yyyyMMdd  比如:  20200523 \*/
public static final String YYYYMMDD = "yyyyMMdd"; /\*\* \* yyyy/MM/dd  比如:  2020/05/23 \*/
public static final String YYYY\_MM\_DD\_EN = "yyyy/MM/dd"; /\*\* \* yyyy/M/d 不补0  比如:  2020/5/23 \*/
public static final String YYYY\_M\_D\_EN = "yyyy/M/d"; /\*\* \* yyyy年MM月dd日  比如: 2020年05月23日 \*/
public static final String YYYY\_MM\_DD\_CN = "yyyy年MM月dd日"; /\*\* \* yyyy年M月d日 不补0  比如: 2020年5月23日 \*/
public static final String YYYY\_M\_D\_CN = "yyyy年M月d日"; /\*\* \* yyyy.MM.dd  比如:2020.05.23 \*/
public static final String YYYY\_MM\_DD\_POINT = "yyyy.MM.dd"; /\*\* \* yyyy.M.d 不补0  比如:2020.5.23 \*/
public static final String YYYY\_M\_D\_POINT = "yyyy.M.d"; /\*\* \* yy/MM/dd  比如:20/05/23 \*/
public static final String YY\_MM\_DD\_EN = "yy/MM/dd"; /\*\* \* MM/dd/yy  比如:05/23/20 \*/
public static final String MM\_DD\_YY\_EN = "MM/dd/yy"; /\*\* \* yyyy-MM-dd E  比如:2020-05-23 星期六 \*/
public static final String YYYY\_MM\_DD\_E = "yyyy-MM-dd E"; /\*\* \* yy 年的后2位  比如: 20 \*/
public static final String YY = "yy"; /\*\* \* yyyy  比如:2020 \*/
public static final String YYYY = "yyyy"; /\*\* \* yyyy-MM  比如:2020-05 \*/
public static final String YYYY\_MM = "yyyy-MM"; /\*\* \* yyyyMM  比如:202005 \*/
public static final String YYYYMM = "yyyyMM"; /\*\* \* yyyy/MM  比如:2020/05 \*/
public static final String YYYY\_MM\_EN = "yyyy/MM"; /\*\* \* yyyy年MM月  比如:2020年05月 \*/
public static final String YYYY\_MM\_CN = "yyyy年MM月"; /\*\* \* yyyy年M月  比如:2020年5月 \*/
public static final String YYYY\_M\_CN = "yyyy年M月"; /\*\* \* MM-dd  比如:05-23 \*/
public static final String MM\_DD = "MM-dd"; /\*\* \* MMdd  比如:0523 \*/
public static final String MMDD = "MMdd"; /\*\* \* MM/dd  比如:05/23 \*/
public static final String MM\_DD\_EN = "MM/dd"; /\*\* \* M/d 不补0  比如:5/23 \*/
public static final String M\_D\_EN = "M/d"; /\*\* \* MM月dd日  比如:05月23日 \*/
public static final String MM\_DD\_CN = "MM月dd日"; /\*\* \* M月d日 不补0  比如:5月23日 \*/
public static final String M\_D\_CN = "M月d日"; // ==================================HH:mm:ss 相关Pattern==================================

/\*\* \* HH:mm:ss  比如:17:26:30 \*/
public static String HH\_MM\_SS = "HH:mm:ss"; /\*\* \* H:m:s  比如:17:6:30 \*/
public static String H\_M\_S = "H:m:s"; /\*\* \* HHmmss  比如:170630 \*/
public static String HHMMSS = "HHmmss"; /\*\* \* HH时mm分ss秒  比如:17时06分30秒 \*/
public static String HH\_MM\_SS\_CN = "HH时mm分ss秒"; /\*\* \* HH:mm  比如:17:06 \*/
public static String HH\_MM = "HH:mm"; /\*\* \* H:m  比如:17:6 \*/
public static String H\_M = "H:m"; /\*\* \* HH时mm分 比如:17时06分 \*/
public static String HH\_MM\_CN = "HH时mm分"; /\*\* \* hh:mm a 比如:05:06 下午 如果需要 显示PM 需要设置 Locale.ENGLISH \*/
public static String HH\_MM\_A = "hh:mm a"; // ==================================yyyy-MM-dd HH:mm:ss 相关Pattern==================================

/\*\* \* yyyy-MM-dd HH:mm:ss 比如:2020-05-23 17:06:30 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS = "yyyy-MM-dd HH:mm:ss"; /\*\* \* yyyy-M-d H:m:s 比如:2020-5-23 17:6:30 \*/
public static final String YYYY\_M\_D\_H\_M\_S = "yyyy-M-d H:m:s"; /\*\* \* yyyyMMddHHmmss 比如:20200523170630 \*/
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; /\*\* \* yyyy/MM/dd HH:mm:ss 比如:2020/05/23 17:06:30 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_EN = "yyyy/MM/dd HH:mm:ss"; /\*\* \* yyyy/M/d H:m:s 比如:2020/5/23 17:6:30 \*/
public static final String YYYY\_M\_D\_H\_M\_S\_EN = "yyyy/M/d H:m:s"; /\*\* \* yyyy年MM月dd日 HH:mm:ss 比如:2020年05月23日 17:06:30 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_CN = "yyyy年MM月dd日 HH:mm:ss"; /\*\* \* yyyy年MM月dd日 HH时mm分ss秒 比如:2020年05月23日 17时06分30秒 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_CN\_ALL = "yyyy年MM月dd日 HH时mm分ss秒"; /\*\* \* yyyy-MM-dd HH:mm 比如:2020-05-23 17:06 \*/
public static final String YYYY\_MM\_DD\_HH\_MM = "yyyy-MM-dd HH:mm"; /\*\* \* yyyy-M-d H:m 比如:2020-5-23 17:6 \*/
public static final String YYYY\_M\_D\_H\_M = "yyyy-M-d H:m"; /\*\* \* yyyyMMddHHmm 比如:202005231706 \*/
public static final String YYYYMMDDHHMM = "yyyyMMddHHmm"; /\*\* \* yyyy/MM/dd HH:mm 比如:2020/05/23 17:06 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_EN = "yyyy/MM/dd HH:mm"; /\*\* \* yyyy/M/d H:m 比如:2020/5/23 17:6 \*/
public static final String YYYY\_M\_D\_H\_M\_EN = "yyyy/M/d H:m"; /\*\* \* MM-dd HH:mm 比如:05-23 17:06 \*/
public static final String MM\_DD\_HH\_MM = "MM-dd HH:mm"; /\*\* \* MM月dd日 HH:mm 比如:05月23日 17:06 \*/
public static final String MM\_DD\_HH\_MM\_CN = "MM月dd日 HH:mm"; /\*\* \* MM-dd HH:mm:ss 比如:05-23 17:06:30 \*/
public static final String MM\_DD\_HH\_MM\_SS = "MM-dd HH:mm:ss"; /\*\* \* MM月dd日 HH:mm:ss 比如:05月23日 17:06:30 \*/
public static final String MM\_DD\_HH\_MM\_SS\_CN = "MM月dd日 HH:mm:ss"; /\*\* \* yyyy年MM月dd日 hh:mm:ss a 比如:2020年05月23日 05:06:30 下午  如果需要 显示PM 需要设置 Locale.ENGLISH \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_A\_CN = "yyyy年MM月dd日 hh:mm:ss a"; /\*\* \* yyyy年MM月dd日 hh时mm分ss秒 a 比如:2020年05月23日 17时06分30秒 下午  如果需要 显示PM 需要设置 Locale.ENGLISH \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_A\_CN\_ALL = "yyyy年MM月dd日 hh时mm分ss秒 a"; // ==================================yyyy-MM-dd HH:mm:ss.SSS 相关Pattern==================================

/\*\* \* yyyy-MM-dd HH:mm:ss.SSS 比如:2020-05-23 17:06:30.272 \*/
public static final String YYYY\_MM\_DD\_HH\_MM\_SS\_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; /\*\* \* yyyyMMddHHmmssSSS 比如:20200523170630272 \*/
public static final String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS"; /\*\* \* yyyy-M-d H:m:s.SSS 比如:2020-5-23 17:6:30.272 \*/
public static final String YYYY\_M\_D\_H\_M\_S\_SSS = "yyyy-M-d H:m:s.SSS"; /\*\* \* yyyy/M/d H:m:s.SSS 比如:2020/5/23 17:6:30.272 \*/
public static final String YYYY\_M\_D\_H\_M\_S\_SSS\_EN = "yyyy/M/d H:m:s.SSS"; // ==================================Iso相关Pattern 包含 T==================================

/\*\* \* yyyy-MM-dd'T'HH:mm:ssZ 比如:2020-05-23T17:06:30+0800 \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_Z = "yyyy-MM-dd'T'HH:mm:ssZ"; /\*\* \* yyyy-MM-dd'T'HH:mm:ssxxx 比如:2020-05-23T17:06:30+08:00 \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_XXX = "yyyy-MM-dd'T'HH:mm:ssxxx"; /\*\* \* yyyy-MM-dd'T'HH:mm:ssXXX 比如:2020-05-23T17:06:30+08:00 0时区时末尾 为Z \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_XXX\_Z = "yyyy-MM-dd'T'HH:mm:ssXXX"; /\*\* \* yyyy-MM-dd'T'HH:mm:ss.SSSZ 比如:2020-05-23T17:06:30.272+0800 \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_SSS\_Z = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; /\*\* \* yyyy-MM-dd'T'HH:mm:ss.SSSxxx 比如:2020-05-23T17:06:30.272+08:00 \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_SSS\_XXX = "yyyy-MM-dd'T'HH:mm:ss.SSSxxx"; /\*\* \* yyyy-MM-dd'T'HH:mm:ss.SSSXXX 比如:2020-05-23T17:06:30.272+08:00 0时区时末尾 为Z \*/
public static final String YYYY\_MM\_DD\_T\_HH\_MM\_SS\_SSS\_XXX\_Z = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; // ==================================其他格式 Pattern==================================

/\*\* \* Date 默认格式 EEE MMM dd HH:mm:ss zzz yyyy 比如:  Sat May 23 17:06:30 CST 2020 \*/
public static final String EEE\_MMM\_DD\_HH\_MM\_SS\_ZZZ\_YYYY = "EEE MMM dd HH:mm:ss zzz yyyy";

}

上面都是经过验证的格式和实例,下面是几个常见问题

1.不补0格式问题

使用单个字符表示,如果小于对应位置的位数,不补0。

比如 : 2020/5/23 使用 yyyy/M/d

2.AM PM格式问题

这个根据语言设置 Locale.ENGLISH,不设置的话是 上午,下午。跟随系统语言。

DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);

3.+08:00格式 问题

Java8中比以前多了一个标识,小写 x,在0时区时显示大小写有差异。大写X 显示 Z  小写 x显示 +00:00

/** * yyyy-MM-dd'T'HH:mm:ssxxx 比如:2020-05-23T17:06:30+08:00 */ public static final String YYYY_MM_DD_T_HH_MM_SS_XXX = "yyyy-MM-dd'T'HH:mm:ssxxx"; /** * yyyy-MM-dd'T'HH:mm:ssXXX 比如:2020-05-23T17:06:30+08:00 0时区时末尾 为Z */ public static final String YYYY_MM_DD_T_HH_MM_SS_XXX_Z = "yyyy-MM-dd'T'HH:mm:ssXXX";

4.Jdk8 解析 yyyyMMddHHmmssSSS 问题

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8031085

这个问题在Jdk9中修复。

Java8中推荐创建DateTimeFormatter方式:

DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss").appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter()

源代码地址:https://github.com/xkzhangsan/xk-time

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java日期时间API系列20
  Java日期时间API系列19Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnbl
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java日期时间API系列19
  通过Java日期时间API系列6Jdk8中java.time包中的新的日期时间API类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12052195.html)中时间范围示意图:可以很清晰的看出Zo
Wesley13 Wesley13
3年前
Java日期时间API系列25
  通过Java日期时间API系列24Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2F%2520https%3A%2F%2F%2F%2Fw
Wesley13 Wesley13
3年前
Java日期时间API系列34
  通过Java日期时间API系列9Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12110137.html)
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
Java日期时间API系列13
  从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date。下面是时间类互相转换大全,包含Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime和Dat
Wesley13 Wesley13
3年前
Java日期时间API系列35
  通过Java日期时间API系列1Jdk7及以前的日期时间类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12032719.html)中得知,Java8以前除了java.sql.Timestamp扩充