2009-09-23 102 views
16

我想將Date對象保存爲可解析爲Date對象的可讀字符串(例如22/10/2009 21:13:14)。Java中的人類可讀和可分析日期格式

我已經嘗試了很多事情,我能找到的最好的方法是使用DateFormater進行解析和格式化,但它有一個挫折。格式化日期時,會丟失秒信息。我試圖找出是否有格式化它並顯示秒數的選項(甚至更好的是毫秒級別,因爲這是Date對象允許你擁有的分辨率),但是我沒有做到。

任何想法?

回答

37

看看java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS"); 
Date dt = new Date(); 
String S = sdf.format(dt); // formats to 09/23/2009 13:53:28.238 
Date dt2 = sdf.parse(S); // parses back 
+0

當這個答案寫於2009年,SimpleDateFormat是我們爲此目的而設計的。它已被證明是麻煩的,幸運的是在2014年被'java.time',現代Java日期和時間API以及'DateTimeFormatter'類所取代。我建議你不要再使用'SimpleDateFormat'。 – 2018-01-18 17:46:30

4

SimpleDateFormat可以格式化和分析基於一個非常簡單的模式系統,該系統包括第二代甚至毫秒的日期。

+1

@Unihedron更新了鏈接。審稿人請注意,這不是一個鏈接唯一的答案 - 答案仍然沒有鏈接意義,鏈接本身是官方文檔。 – 2014-09-13 05:54:16

2

有點偏離主題,但我總是覺得有必要提醒人們,DateFormat和SimpleDateFormat不是線程安全的! Sun的文檔清楚地說明了這一點,但我一直在野外尋找代碼,人們將SimpleDateFormat固定在一個靜態...

+0

這就是爲什麼大家應該使用喬達時間,而不是自己節省頭痛:) – Nick 2009-09-24 09:21:56

+0

我完全同意。另一方面,我希望Sun能夠修復這些課程,所以如果沒有其他任何內容,我不必再通過另一個「併發經驗教訓」 - 與人們一起警告我們。 (哦,諷刺的是,我只是在StackOverflow上完成了同樣的事情:-)) – 2009-09-24 11:39:17

4

其他答案都很好。

但在做的事情這種時候請挑選各種適當作爲字符串......「YYYY/MM/DD HH:MM:SS」時,編碼格式是好的。當軟件工程師選擇不明顯,便捷的日期格式時,它總是令我震驚。

你會在將來某個遙遠的點保存你的同胞開發商很多痛苦的 - 認爲它是好人緣:-)

+0

「yyyy/dd/MM」排序不正確。考慮將2015/21/10,2015/20/11和2015/22/11作爲字符串分類到2015/20/11,2015/21/10和2015/22/11。 – 2015-12-10 15:33:07

+2

對不起,我的意思是yyyy/MM/dd。固定。 – mikera 2015-12-11 02:12:14

1

ISO 8601

使用ISO 8601格式。

  • 它是靈活的,它包含秒,第二部分,如果有的話,但你也可能會離開他們,如果他們都爲0
  • 它的標準,所以越來越多的工具,格式和解析它。非常適合存儲或數據交換的序列化。
  • 它就像2009-10-22T21:13:14,我應該說這是相當人類可讀的(儘管中間的T表示時間部分的開始可能起初感覺不尋常)。
  • 的字符串中正確排序的要求,在another answer,mikera只要年是四位數的範圍從1000到9999
  • java.time的類,現代的Java日期和時間API,以及Joda Time的用戶將其缺省值解析爲ISO 8601,也就是說,沒有任何明確的格式化程序,並從其toString方法中生成相同的格式。

使用java.time適度示範:

LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14); 
String readableString = dateTime.toString(); 
System.out.println(readableString); 
LocalDateTime parsedBack = LocalDateTime.parse(readableString); 
System.out.println(parsedBack); 

這將打印兩個相同的線路:

2009-10-22T21:13:14 
2009-10-22T21:13:14 

後者System.out.println()呼叫隱式調用toString()一次,所以這不應該感到驚訝。

0

如果你想要做的更簡單一點,並作出自己的日期格式,大多數其他的答案涉及倖免,你可以在java.time.Instant利用默認的格式:

(new Date()).toInstant.toString();