0

问题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

我在山区标准时间

4

3 回答 3

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 的间隔类

于 2012-06-01T16:01:33.740 回答
1

你的机器在哪个时区?是否可能进行时区转换?

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

于 2012-06-01T15:58:28.763 回答
0

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

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

于 2012-06-01T16:02:54.713 回答