【问题标题】:How can I convert milliseconds into the corresponding date right?如何将毫秒转换为相应的日期?
【发布时间】:2011-12-17 03:34:33
【问题描述】:

我对日期有疑问。

我确定这些毫秒 1317322560000 代表意大利 2011 年 9 月 29 日星期四 18:56:00 GMT+02:00 的日期。

但是使用 Calendar 类,日期是 Thu Sep 29 20:56:00 GMT+02:00。我认为发生这种情况是因为夏季日程已经生效。

如何将毫秒转换为相应的日期?

【问题讨论】:

  • 你从哪里得到 Thu Sep 29 18:56:00 GMT+02:00?
  • 来自 System.currentTimeMillis()
  • 请接受一些答案。如果答案正确,您可以接受。

标签: java date gmt


【解决方案1】:

System.currentTimeMillis() 返回“当前时间与 1970 年 1 月 1 日 UTC 午夜之间的差异,以毫秒为单位。” (即格林威治标准时间)。

因此,您拥有的“日期”1317322560000 是 29/09/2011:18:56:00 GMT。在意大利,9 月 29 日与 GMT 的偏移量为 +2 小时(因为“夏令时”或从技术上讲 DST = Daylight Saving Time)。从 30/10/2011:03:00:00(顺便说一句)开始,在意大利,他们将处于“冬季”(无 DST),因此偏移量将为 +1)。

因此,您正确获得了 Thu Sep 29 20:56:00 CEST 2011(18:56:00 + 意大利时区的 2 小时偏移)。请检查显示所有这些内容的代码(它是 Groovy)。

import java.text.DateFormat
import java.util.TimeZone

println Locale.getDefault()
Date d = new Date(1317322560000)
println d
Locale.setDefault(new Locale("it", "IT"))
println Locale.getDefault()

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
println df.getTimeZone().getOffset(1317322560000) + " => +2h offset in 'summer time' (DST on)"

df.setTimeZone(TimeZone.getTimeZone("GMT+00:00"))
println df.format(d)
df.setTimeZone(TimeZone.getTimeZone("GMT+01:00"))
println df.format(d)
df.setTimeZone(TimeZone.getTimeZone("GMT+02:00"))
println df.format(d)
df.setTimeZone(TimeZone.getTimeZone("Europe/Rome"))
println df.format(d)
println "---"

Date winterDate = new Date(1321382560000)
println winterDate
println df.getTimeZone().getOffset(1321382560000) + " => +1h offset in 'winter time' (DST off)"

这个结果:

es_ES
Thu Sep 29 20:56:00 CEST 2011
it_IT
7200000 => +2h offset in 'summer time' (DST on)
giovedì 29 settembre 2011 18.56.00 GMT+00:00
giovedì 29 settembre 2011 19.56.00 GMT+01:00
giovedì 29 settembre 2011 20.56.00 GMT+02:00
giovedì 29 settembre 2011 20.56.00 CEST
---
Tue Nov 15 19:42:40 CET 2011
3600000 => +1h offset in 'winter time' (DST off)

【讨论】:

  • 没关系,但是如果我想从这个数据格式创建一个日历,当我请求日期时,结果是 20.56
  • 如果时区为 GMT+00:00 则显示 18:56,如果 TZ 为 GMT+01:00 则显示 19:56,如果 TZ 为 GMT+02:00,则显示 20:56,即你的情况。如果您的时区是 GMT+2,则无法获得不同的结果。所以我猜当你得到“18:56”时,你正在运行时区设置为 GMT+0 的代码。
【解决方案2】:

new Date(1317322560000l)

输出

Thu Sep 29 20:56:00 CEST 2011

与您的日历相同。为什么应该是18:56

【讨论】:

  • 可以,但结果不会改变
  • 为什么这些毫秒记录在意大利正好是 18:56
  • 我认为 System.currentTimeMillis()
  • 这意味着如果您在 18:56 执行 new Date(System.currentTimeMillis()) 会显示 20:56.. 您现在可以试试看是否有相同的 2 小时差距?
  • 我现在试试 System.currentTimeMillis(),结果是 Fri Oct 28 11:32:24 GMT+02:00 2011,这是好的日期!!!
【解决方案3】:

确实是 Thu Sep 29 20:56:00 GMT+02:00。即 UTC 中的相应日期时间是 Thu Sep 29 18:56:00Z 其中Z 代表 Zulu,是零时区偏移量的 timezone designator+00:00 小时偏移量或Etc/UTC 时区)。

使用现代 API java.time 的解决方案

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(1317322560000L);

        // In Rome
        ZonedDateTime zdtRome = instant.atZone(ZoneId.of("Europe/Rome"));
        System.out.println(zdtRome);

        // In UTC
        ZonedDateTime zdtUtc = instant.atZone(ZoneId.of("Etc/UTC"));
        System.out.println(zdtUtc);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd uuuu HH:mm:ssXXX", Locale.ENGLISH);
        System.out.println(zdtRome.format(dtf));
        System.out.println(zdtUtc.format(dtf));
    }
}

输出:

2011-09-29T20:56+02:00[Europe/Rome]
2011-09-29T18:56Z[Etc/UTC]
Thu Sep 29 2011 20:56:00+02:00
Thu Sep 29 2011 18:56:00Z

通过 Trail: Date Time 了解有关 modern date-time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2019-12-24
    • 1970-01-01
    • 2012-01-04
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多