2012-06-01 200 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,它对持续时间有明确的支持(尽管我从来不必格式化)。