程序猿不要在寫日期轉換工具了,萬能代碼片段直接拿走使用

2021-01-07 軟體編程指南

作為開發者,每個開發項目中一定有很多的工具類,而其中百分之六七十就有一個DateUtils工具。每次都要寫日期格式,yyyyMMdd。每個項目項目中使用的日期格式都不一樣。終於有一天,一堆程序猿受不了了。於是把所有的日期格式都寫完。放到一個工具裡。使用就完了。文尾提供代碼。歡迎收藏使用。

『手機格式不友好,建議收藏PC複製使用』

目錄

1.JDK中DateTimeFormatter與SimpleDateFormat的區別

2.DatePatternEnum API

3.Code Example

4.完整代碼

1.JDK中DateTimeFormatter與SimpleDateFormat的區別

舊版的API存在線程安全的問題,所謂線程安全問題,只會存在在多線程場景下。當多個線程對同一個對象的,屬性進行修改時候,就很大機率會產生數據不同步問題,舉一個簡單的例子: A線程看到門外有一個人是小明,然後準備開門讓小明進來時候,B線程把小明拉走了,讓小張站門外了。結果導致A開門原本準備讓小明進來,結果開門小張進來了。SimpleDateFormat的問題就是這樣。format方法時候會將屬性改變從而導致線程安全。因為現在建議使用新的日期API來替換老的。

2.DatePatternEnum API

3.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();4.完整代碼

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 * */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); }}

相關焦點

  • 轉換寶萬能轉換工具
    轉換寶萬能轉換工具 圖像轉換 大小: 41 KB
  • ...我們經常會需要在代碼中進行日期的轉換、日期的格式化等操作。
    在Java中進行日期處理大家一定都不陌生,我們經常會需要在代碼中進行日期的轉換、日期的格式化等操作。而一般我們進行日期格式化的時候都會使用SimpleDateFormat工具,之前我們有一篇文章介紹過SimpleDateFormat的線程安全問題(https://www.hollischuang.com/archives/3017),這一篇文章再來介紹一個和SimpleDateFormat有關,很容易被忽視,而一旦忽視可能導致大故障的問題。
  • 今天是1024程式設計師節,我是程序猿,我餵自己袋鹽……
    寫在前面正值1024程式設計師節日來臨之際,今天心血來潮,想寫篇文章來為我們這些程序猿致敬,也算了卻一個心願,讓我們這些程序猿們以自己從事的職業為豪為榮。8.我們很細心編譯,調試,再編譯,再調試,功能跑通,SVN提交代碼(地震火災,世界末日,也一定要先提交代碼再行離開),絕對不能讓程序出亂子,沒錯,我們是一群細心的猿。
  • 如何做一個優秀的程序猿呢?答案原來在這裡……
    怎樣做一名合格的程序猿呢?很多人寫了很多年的代碼,不思考,結果就造成了只會寫代碼,不會思考代碼的陋習。這對自己的軟體編程生涯是很不友好的。下面我就來給大家分享下自己的一些感悟吧!技術是解決問題的工具,不是解決問題的根本:所有的代碼實現僅僅是用於幫助我們解決問題的簡單工具,真正能夠體現我們的能力的是我們的邏輯思維,我們的思考;少寫代碼:這句話看起來很矛盾。程式設計師的工作不就是寫代碼麼?我們做的不僅僅是將功能實現,我們需要做的是讓代碼儘量精簡,讓代碼的耦合度更低,通用性更高。因為代碼越多,出現未知錯誤的機會就越多,代碼的維護也更加麻煩。
  • 中文C之使用繁體字編寫程序!
    使用繁體字寫的中文C程序代碼你說這個通用互譯系統強大嗎? 居然還能使用繁體字寫程序! 厲害了...進一百多例C語言代碼學習一個好的編程工具沒學習例子程序代碼,你說一個剛剛學習編程人員會說這個工具好嗎?成語字典如果你不是編程人員,這個工具一樣讓你滿意 可以用這個通用互譯系統寫寫文章,學習漢字,玩成語接龍還有學習英語知識。
  • 工具:C 程序轉換ShellCode利器
    一、背景1、在滲透測試中,C#將會逐步替代Powershell;2、就目前的趨勢來說,C#開源的工具越來越多;3、使用C#開發的程序都能通過Donut轉換成shellcode。其他目錄中的都有sln,可以直接vs2019編譯生成Dll或Exe。三、功能Donut是一個ShellCode生成工具,可以將.NET程序集轉換為ShellCode。這是對Execute-Assembly的進一步利用,隱蔽性更高,可擴展性更強。
  • 程式設計師心聲:Code Monkey 程序猿之歌
    《Code Monkey 程序猿之歌》,閒話不說,直接視頻!也夠無聊)  Rob say Code Monkey very diligent(Rob說程序猿很勤奮)  But his output stink(但做的東西卻不行)  His code not 「functional」 or 「elegant」(他的代碼「用不了」或「不夠好」)  What do Code Monkey think?
  • 最牛的黑客代碼工具!
    工欲善其事,必先利其器,每一位程式設計師都有自己私藏的編程必備工具,接下來小編就給大家推薦5款程式設計師最佳的代碼比較工具。這就是說,使用 Diffuse 你可以同時比較兩個或三個文本文件。支持常見的版本控制工具,包括 CVS、subversion、git、mercurial 等,你可以通過 Diffuse 直接從版本控制系統獲取原始碼,以便對其進行比較和合併。
  • GitLab 13.6可自動部署程序代碼至AWS EC2
    GitLab推出了最新13.6版本,這個版本提高自動化的能力,藉以改進系統的易用性,並且提升安全性可見度,使得開發者更容易做出決策,VS Code擴展組件也獲得改進,開發者能方便地在VS Code中插入程序代碼片段,另外,GitLab也處理了Docker Hub限制拉取請求的問題。
  • 7個頂級靜態代碼分析工具
    作者丨Saif Sadiq策劃丨田曉旭靜態代碼分析或原始碼分析是指使用靜態代碼分析工具對軟體的「靜態」(不運行的)
  • xk-time 1.1.0 發布,Java 時間工具包,增加模糊解析日期功能
    時間轉換,計算,格式化,解析,日曆和cron表達式等的工具,使用java8,線程安全,簡單易用,多達20幾種常用日期格式化模板。0.為什麼要開發這個工具?(1)java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。
  • qsv格式怎麼轉換成mp4?簡單好用的視頻轉換工具都在這了!
    我們需要將其轉換為mp4格式!小編為大家找到了幾個qsv轉換成mp4比較簡單好用的轉換工具,大家選擇自己比較喜歡的轉換工具使用。一 、萬能視頻格式轉換器萬能視頻格式轉換器是一款支持格式眾多的視頻格式轉換工具。
  • 97年小哥開發程序猿專屬約會社交軟體VSinder
    近日,一位來自美國的程序猿小哥Ben Awad火了,他開發了一款程序猿專屬的社交軟體VSinder,靈感就來自於Tinder,但他認為約會交友更重要的是內在,而不是專注於外貌。Linux的創始人說過「Talk is cheap.
  • 程式設計師福音,麻省理工將推出代碼移植工具 CodeCarbonCopy
    CodeCarbonCopy之所以能夠做到這些,第一是有基本變量移植的能力,使用CodeCarbonCopy意味著從獲取和導入代碼片段的兩個地方並行運行程序,CodeCarbonCopy可識別完成同一角色的變量,並為操作人員將它們列出來。它還顯示了無法匹配的變量,這樣一來,程式設計師可以手動關聯變量或者將變量從移植過去的代碼去除。
  • 人人都是程序猿,可視化編程平臺初現,技術打敗了技術?
    可能各位想不到,看起來高大上收入遙遙領先的程序猿們,其實從事的是人力密集型行業,大部分享受996福報的他們每天都是在重複而機械地勞動而已,因此也被稱為碼農或者IT民工,這也是為什麼各大網際網路公司有強硬的底氣淘汰中年人的原因,畢竟IT民工嘛,要多少有多少!
  • 如何使用uni-app中的日曆組件並獲取日期
    工具HBuilderX微信開發者工具技術>1、打開HBuilderX開發工具,創建uni-app項目;然後新建uni-app頁面,添加uni-calendar組件,設置日曆相關的屬性添加uni-calendar組件,設置相關屬性2、保存代碼並編譯,打開微信開發者工具,查看界面顯示效果,出現一個日曆
  • 無法直接複製網頁文字?只需一串代碼,全網內容任你免費複製!
    在職場辦公時候,經常需要在網上找素材文檔,不過現在網上很多網頁都有限制性,想要直接複製的話是不可能的,這時候我們該怎麼辦呢?是望梅止渴還是另尋他家!這裡小編為大家分享幾招,保準管用,想怎麼複製就怎麼複製,什麼限制都沒有!
  • java中date日期計算使用方法
    在java中,日期時間類是我們經常使用的一個類。那麼怎麼創建時間類呢。很簡單,代碼如下:Date date = new Date();上述代碼便初始化了一個時間類,雖然簡單,但是裡面的坑不少。單純的這樣寫並不能輸出我們想要的數據。上面代碼將會輸出一個標準國際時間,如圖所示:
  • 萬能遙控器代碼---萬能遙控器設置方法
    電視是每個家庭必不可少的家用電器,所以我們在使用遙控器的時間也會比較多。
  • 匯才論文工具分享:免費轉換PDF,文獻全篇翻譯的良心網站
    能夠實現對PDF的任意轉換,並且還能夠實現對PDF文件的文字編輯、內容排版等。看到有人留言要付費,可能是找不到免費下載途徑,那麼可以使用今天的網站——DocTranslator,方便到連註冊都不要。找到網站點擊相關功能按鈕,會彈出一個窗口,我們繼續點擊相關按鈕,會提示你安裝chrome網上應用商店中的一個程序工具,然後只要點擊安裝就好。