13

我不需要一个完整的故事来澄清我的问题,所以我将只显示代码(这只是一个示例)。为什么我的结果有差异?

代码

long millis = 2305293L;
System.out.println(
    millis + "ms = " + 
    (millis / 1000) + "s = " + 
    (millis / 1000 / 60) + "m");
System.out.println(
    new SimpleDateFormat("HH:mm:ss").
    format(
        new Date(millis)
        )
    );

输出

2305293ms = 2305s = 38m
01:38:25
4

3 回答 3

39

如果您在伦敦或巴黎,则时区为 1970 年 1 月 1 日的 GMT+1。

由于@ARC 在评论中解释的原因,英国在 1968 年 2 月 18 日至 1971 年 10 月 31 日期间使用 GMT+1 或 UTC+1

我可以在没有任何时区干扰的情况下转换 long 吗?

将时区设置为 GMT。

long millis = 2305293L;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(new Date(millis)));

印刷

00:38:25.293
于 2013-01-02T15:39:01.510 回答
2

试试这个 :

System.out.println(new java.util.Date (0));

您会看到它从 01:00:00 开始,因此相差一小时。

于 2013-01-02T15:42:23.783 回答
1

其他答案是正确的,并且是 2013 年提出问题时的好答案。今天我们不应该再使用Datenor SimpleDateFormat,所以我想向您展示几个现代代码片段。格式化(在这种情况下)2 305 293 毫秒的正确方法取决于它们所代表的内容。我针对三种不同的情况提出了三种选择。

格式化自纪元以来的毫秒数

您需要决定要在哪个时区解释您的时间点。例如:

    long millis = 2_305_293L;
    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.LONG)
            .withLocale(Locale.ENGLISH);
    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("America/Coral_Harbour"));
    String formattedTime = dateTime.format(formatter);
    System.out.println(formattedTime);

美国东部时间 1969 年 12 月 31 日晚上 7:38:25

由于在时代珊瑚港处于 UTC 偏移量 -05:00,我们得到一个接近 1969 年底的时间。如果你想要 UTC 时间(因为时代是用 UTC 定义的;换句话说,如果你想要00:38:25),有点不同:

    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.ENGLISH);
    OffsetDateTime dateTime = Instant.ofEpochMilli(millis)
            .atOffset(ZoneOffset.UTC);

1970 年 1 月 1 日,上午 12:38:25

除了时区之外,您还可以通过语言环境来改变语言,并通过格式样式(完整、长、中、短)来改变格式的长度。如果您想要没有日期的一天中的时间,请使用ofLocalizedTime而不是ofLocalizedDateTime.

格式化一天的毫秒

假设您的毫秒是从 0:00(“午夜”)开始在任何时区:

    LocalTime time = LocalTime.MIN.with(ChronoField.MILLI_OF_DAY, millis);
    System.out.println(time);

00:38:25.293

如果此格式令人满意,则不需要任何显式格式化程序。如果没有,您可以使用DateTimeFormatter.

格式化持续时间,时间量

时间量与时间是完全不同的东西,它被当作一个Duration对象来处理。没有直接支持格式化它,但从 Java 9 开始,它并不难(当你知道如何操作时):

    Duration amountOfTime = Duration.ofMillis(millis);
    String formattedTime = String.format("%02d:%02d:%02d",amountOfTime.toHours(),
            amountOfTime.toMinutesPart(), amountOfTime.toSecondsPart());
    System.out.println(formattedTime);

00:38:25

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2019-06-04T14:05:16.923 回答