时间戳格式增加17小时

时间:2012-06-01 15:55:03

标签: java time timestamp

问题SimpleDateFormat似乎在实际时间戳上增加了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

我在山地标准时间

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的机器在哪个时区?它可能正在进行时区转换吗?

如果是这样,使用Java TimeZone类可能会有所帮助:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html

答案 2 :(得分:0)

在使用SimpleDateFormat格式化时,您隐式将持续时间转换为日期。要格式化该日期半安全地在GMT时区中进行格式化,而不使用DST。遇到+24小时的持续时间时仍会出现问题。

更好的解决方案是编写Duration类和SimpleDurationFormat类。这是一种痛苦,但你只需要这样做一次。替代品也存在,比如吮吸JodaTime,它明确支持持续时间(虽然我从来没有格式化过)。