從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()