问题是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
我在山地标准时间
答案 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,它明确支持持续时间(虽然我从来没有格式化过)。