2012-06-01 241 views
0

問題SimpleDateFormat似乎是17小時添加到實際的時間戳。時間戳格式添加17小時

這應該是非常簡單的事情。我不確定我做錯了什麼。我有一種方法可以將長達幾納秒的時間轉換爲格式化的時間戳。它增加了17個小時。這裏是我的SSCCE

package playground; 

import java.sql.Timestamp; 
import java.text.SimpleDateFormat; 
import java.util.concurrent.TimeUnit; 

/** 
* 
* @author kentcdodds 
*/ 
public class NanosecondsToString { 

    public static void main(String[] args) { 
    long nanoseconds = 234236402; 
    Timestamp ts = new Timestamp(TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS)); 
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS"); 
    String formatted = format.format(ts); 
    System.out.println(formatted); 
    } 
} 

輸出:17:00:00:234

我在山地標準時間

+0

它爲你做了一些時區調整嗎?你在哪裏關於格林威治標準時間? – bluevector

+0

我在Mountain Standard Time – kentcdodds

+1

雖然你的SSCCE比大多數都好,但它是否是一個沒有進口陳述的SSCCE?並非每個人都會爲了短小的問題而啓動IDE。 –

回答

4

您必須將時區設置爲UTC

public static void main(String[] args) throws IOException { 
       long nanoseconds = 234236402; 
       Timestamp ts = new Timestamp(TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS)); 
       SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS"); 
       format.setTimeZone(TimeZone.getTimeZone("UTC")); 
       String formatted = format.format(ts); 
       System.out.println(formatted); 
    } 

SimpleDateFormat將默認時間戳轉換爲時間在你當前時區。所以有必要告訴它將其假定爲UTC。否則,您可以使用jodatime's interval class

+0

這樣做。謝謝! – kentcdodds

0

在使用SimpleDateFormat格式化時,您隱式地將持續時間轉換爲日期。要格式化日期半安全地格式化GMT時區中的格式,而不使用DST。這在遇到+24小時的持續時間時仍然會遇到問題。

更好的解決方案是對Duration類和SimpleDurationFormat類進行編碼。這是一種痛苦,但你只需要做一次。替代方案也存在,比如吮吸JodaTime,它對持續時間有明確的支持(儘管我從來不必格式化)。