3

我尝试使用 SimpleDateFormat 格式化时间间隔。

import java.text.*;
import java.util.*;

public class DateFormatTest {
  public static void main(String[] args) {
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
    long interval = 1000;
    System.out.println("Interval in millis: " + interval);
    System.out.println("Expected result: 00:00:01");
    System.out.println("Result using Date and SimpleDateFormat: " +
      sdf.format(new Date(interval)));
  }
}

我得到以下结果:

Interval in millis: 1000
Expected result: 00:00:01
Result using Date and SimpleDateFormat: 01:00:01

我在 GMT+1 时区。但它不应该反映在结果中。

当然可以用 System.out.printf 解决,但我正在寻找的是原因。

4

3 回答 3

4

我在 GMT+1 时区。但不应该反映在结果中。

是什么让你这么想的?new Date(0)是 1970 年 1 月 1 日格林威治标准时间上午 00:00。因此,如果您的默认时区是格林威治标准时间 + 1,那么它是上午 01:00。

于 2013-01-05T12:05:20.097 回答
3

我在 GMT+1 时区。但它不应该反映在结果中。

然后你应该在SimpleDateFormat. SimpleDateFormat正在做完全正确的事情 - 它正在格式化它正在工作的时区中的时间瞬间(就在UTC 1970午夜之后)。

要更改时区,只需使用:

sdf.setTimeZone(TimeZone.getTimeZone("etc/UTC"));

不过,尚不清楚您是否真的应该使用SimpleDateFormat。您不是在尝试格式化日期/时间 - 您是在尝试格式化interval,给定您的变量名称。

我建议你使用Joda Time,它有丰富的类型系统,可以让你表达你真正想要的。

此外,如果您真的想使用SimpleDateFormat,您可能希望在格式字符串中使用HH而不是。hhhh是 12 小时值,1-12。您想要 00:00:01,而不是 12:00:01。)当您的模式中没有 am/pm 指示符hh时,很少适用。

于 2013-01-05T12:06:28.330 回答
1
于 2020-02-09T19:43:32.227 回答