2012-02-20 94 views
4

我有一個問題,試圖讓DateFormat庫給我一個字符串與日期格式化爲2毫秒的地方,而不是通常的3.我意識到這是沿着釐秒線,但afaik Java不支持。Java DateFormat爲2毫秒精度

這是一些代碼來顯示我遇到的問題。我期望它輸出到兩毫秒,但它輸出三。

public class MilliSeconds { 
private static final String DATE_FORMAT_2MS_Digits = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'"; 
private static DateFormat dateFormat2MsDigits = new SimpleDateFormat(DATE_FORMAT_2MS_Digits); 

public static void main(String[] args){ 
    long milliseconds = 123456789123l; 
    System.out.println(formatDate2MsDigits(new Date(milliseconds))); 
} 

public static String formatDate2MsDigits(Date date) 
{ 
    dateFormat2MsDigits.setCalendar(Calendar.getInstance(new SimpleTimeZone(0, "GMT"))); 
    return dateFormat2MsDigits.format(date); 
}} 

輸出:

1973-11-29T21:33:09.123Z

我可以分析得到的字符串,並刪除我不想要的數字,但我希望能有一個更清晰的方式來實現這一點。有誰知道如何讓這個工作,或爲什麼它不工作?

回答

3

對不起。 Acording到的字母數字組件javadoc

數除了它的 需要兩個相鄰字段

分開被忽略......所以我不認爲有一個直接的方式來做到這一點。

我會使用一個單獨的格式只爲SSS和調用substring(0, 2)

+0

謝謝,我沒有想到在毫秒內有單獨的格式。 – Lithium 2012-02-20 16:39:52

+2

可能一點也不復雜,但是沒有祖魯時間指標。然後修剪掉最後一個字符並添加到Z. – msandiford 2012-02-20 16:51:08

0

我還沒有能夠推斷爲什麼會出現問題,但在用yoda替換日期格式後,生成的時間字符串有正確的秒數[只有2]。

+1

我認爲這只是方法合同。當你說S時,這是從1到3位數字的毫秒數。 SS是2到3位數的ms。 SSS總是有3位數字。也許yoda有另一份合同。 – helios 2012-02-20 16:27:21

+0

@helios,你是對的。對於SS,只有第三位數字爲0時,它纔會顯示2位數字。 – bbaja42 2012-02-20 16:32:08

0

我將包括Joda Time和使用喜歡的東西:

private static final String DATE_FORMAT_2MS_FMT = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'"; 

private static final DateTimeFormatter DATE_FORMAT_2MS_DIGITS = DateTimeFormat 
     .forPattern(DATE_FORMAT_2MS_FMT).withZoneUTC(); 

public static String formatDate2MsDigits(Date date) { 
    return DATE_FORMAT_2MS_DIGITS.print(date.getTime()); 
} 

如果你不想額外的依賴呢,我覺得從.format(...)擺弄結果字符串是唯一的出路。