2012-12-06 16 views
21

如何將javax.time.Instant格式化爲本地時區中的字符串?以下內容將本地Instant轉換爲UTC,而不是我所期待的當地時區。刪除toLocalDateTime()的呼叫也是這樣。我怎樣才能獲得當地時間呢?如何將javax.time.Instant格式化爲本地時區中的字符串?

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    DateTimeFormatter formatter = builder.appendPattern("yyyyMMddHHmmss").toFormatter(); 
    return formatter.print(ZonedDateTime.ofInstant(instant, TimeZone.UTC).toLocalDateTime()); 
} 

注:我們正在使用的JSR-310參考實現較舊版本0.6.3

回答

0

之前你失望投我的回答,請注意,明確的問題(和粗體)指的是JSR-310參考實現的舊版本0.6.3!我在2012年12月問了這個問題,就在Java 8和新的日期庫到來之前!


我放棄了對JSR-310類DateTimeFormatterZonedDateTime,而是使出老式java.util.Datejava.text.SimpleDateFormat

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
    Date date = new Date(instant.toEpochMillisLong()); 
    return format.format(date); 
} 
+0

我真的不覺得有必要訴諸這種老方法。 –

+0

@SimonAndréForsberg:不幸的是,我不得不因爲我們使用了JSR-310參考實現的0.6.3。幸運的是,雖然我們的產品仍然使用Java 7,但我們後來轉向了Java 8中出現的最新JSR-310。 –

+0

Date也有一個方法Date.from(instant)。 Nwm,現在看你的奇怪版本 – softarn

6

爲什麼你會期望它使用當地時區?你明確要求UTC:

ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

只要指定本地時區,而不是:

ZonedDateTime.ofInstant(instant, TimeZone.getDefault()) 
+0

我期待'toLocalDateTime()'將其轉換爲本地或默認時區。顯然,我誤解了'toLocatlDateTime()'做了什麼。我以爲我可以創建一個'LocalDateTime',但是這個類沒有將'Instant'轉換爲'LocalDateTime'的方法。 –

+2

@DerekMahar:基本上,本地並不意味着你的想法。它只是意味着與任何特定時區無關的日期和時間。舉例來說,世界各地,新年從1月1日午夜開始。對於任何特定的年份,這是一個LocalDateTime - 在不同的時間*出現在不同的時區。 –

+0

不幸的是,在JSR-310的0.6.3版本中,JSR-310沒有使用'java.util.TimeZone'和類'javax.time.calendar.TimeZone',但是沒有使用getDefault()方法或任何類似的方法。 –

34

回答這個問題WRT的接近完成JDK1.8版本

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); 
return formatter.format(instant); 

關鍵是Instant沒有任何時區信息離子。因此無法使用基於日期/時間字段的任何圖案格式化,如「yyyyMMddHHmmss」。通過指定DateTimeFormatter中的區域,格式化過程中即時會轉換爲指定的時區,從而可以正確輸出。

另一種方法是將轉換爲ZonedDateTime

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())); 

這兩種方法是等效的,不過,我想一般選擇第一,如果我的數據對象是一個Instant

+0

謝謝你的回答。我毫不懷疑這是正確的,但我必須等待下一次應用該解決方案來取代我實施的解決方案。我還必須等到我們的團隊用更新的版本替換版本0.6.3的JSR-310或用JDK 8替換JDK 6. –

1

試試這個:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(
    ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) 
); 

這給:

2014-08-25T21:52:07-07:00[America/Los_Angeles] 

您可以通過使用比DateTimeFormatter.ISO_ZONED_DATE_TIME作爲格式化其他東西更改格式。 DateTimeFormatter有一堆預定義的格式化程序,或者您可以定義自己的格式化程序。

+0

我在JSR 0.6.3版中找不到類'ZoneId' -310參考實現。 –

相關問題