2014-09-24 37 views
0

我想解析一個字符串到日期。無法解析日期並得到毫秒

我使用

new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS").parse("20140923-14:32:34.456") 

我的輸出是:(Date對象)

Tue Sep 23 14:32:34 EDT 2014 

我不明白爲什麼我沒有得到毫秒。我需要毫秒的日期,而不僅僅是毫秒。

預期輸出:(Date對象)

Tue Sep 23 14:32:34.456 EDT 2014 

感謝

PS:我不想在結束,而是一個日期的字符串對象。

+1

如何輸出它?如果你只是在控制檯上拋出一個'Date',那麼你正在運行'toString()'方法,它不包含millis。 – azurefrog 2014-09-24 21:00:25

+0

剛剛使用了System.out.println。那麼如何獲取包括毫秒的整個dateobject – 2014-09-24 21:10:36

+0

您的字符串代表什麼時區? [UTC](http://en.wikipedia.org/wiki/Coordinated_Universal_Time)? – 2014-09-25 04:39:47

回答

5

你只是打印出通話Date.toString()這恰好不包括毫秒的結果。如果您打印出日期調用getTime()的結果,則會看到它以「456」結尾,表明它的分解毫秒數爲已有

另外,不要被Date.toString()輸出的「EDT」部分所迷惑。這並不意味着這是一個Date對象「in」EDT ...一個Date根本沒有時區;這只是unix時代以來的毫秒數。

但是,我建議您明確設置您的SimpleDateFormat的時區,但是 - 即使您故意將其設置爲系統默認時區。通過明確地做,明確地告訴讀者你的意思是使用該時區,而不僅僅是你沒有考慮它。你也應該採用同樣的方法來處理語言環境 - 在這種情況下,我可能會指定Locale.US,這對於機器解析而言比人類更適合設計的格式通常是一個不錯的選擇。

+0

我想要一個毫秒的日期對象。所以我的預期產出是9月23日星期二14:32:34.456 EDT 2014 – 2014-09-24 21:07:14

+0

所有日期對象都有毫秒。 – 2014-09-24 21:10:41

+0

@sa_nyc:那麼你不應該調用'Date.toString()',因爲這不會給你那個輸出。 – 2014-09-24 22:15:51

2

您需要打印你剛纔讀過的日期時使用的格式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS") 
Date date = sdf.parse("20140923-14:32:34.456"); 
System.out.println(date);    // Tue Sep 23 14:32:34 EDT 2014 
System.out.println(sdf.format(date)); // 20140923-14:32:34.456 
1

您的Date對象確實已經包含正確的毫秒數。就是這樣,當你再次寫出Date對象時,Date的默認String表示不包含毫秒。

您大概有:

DateFormat myFormat = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS"); 
Date myDate = myFormat.parse("20140923-14:32:34.456"); 

輸出具有毫秒的日期,你應該使用:

System.out.println(myFormat.format(myDate)); 

不是重用myFormat的,你可以使用不同的日期格式,其中還包括以毫秒爲單位的規範。

0

answer by Jon Skeet是正確的。

喬達時間

我將使用Joda-Time庫添加一些示例代碼。

java.util。在Java中捆綁的Date,java.util.Calendar和java.text.SimpleDateFormat類是非常麻煩的,在設計和實現方面都存在缺陷。避免它們。使用Joda-Time或Java 8中的java.time包(受Joda-Time的啓發,由JSR 310定義)。

在Joda-Time和java.time中,與java.util.Date不同,日期 - 時間對象知道它自己分配的time zone。另一個區別是,這兩個好的庫都使用immutable objects,我們基於原始對象實例化新對象,而不是修改(「變異」)原始對象。

DateTimeZone timeZone = DateTimeZone.UTC; // Or DateTimeZone.forID("America/Montreal") 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd-HH:mm:ss.SSS").withZone(timeZone); 
DateTime dateTime = formatter.parseDateTime("20140923-14:32:34.456"); // Parsed *and* assigned the specified time zone. 
String output = dateTime.toString(); 

您可以轉換爲其他時區。

DateTime dateTimeKolkata = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata")); 

如果您確實需要其他類可能需要的java.util.Date,請從Joda-Time進行轉換。

java.util.Date date = dateTime.toDate();