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

时间:2011-10-28 09:00:42

标签: java date gmt

我对日期有疑问。

我确定这些毫秒1317322560000,代表截止日期为9月29日18:56:00 GMT + 02:00在意大利。

但是使用Calendar类的日期是星期四9月29日20:56:00 GMT + 02:00。我认为这是因为夏季时间表生效了。

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

3 个答案:

答案 0 :(得分:2)

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

所以你有“日期”1317322560000,是29/09/2011:18:56:00 GMT。在意大利,9月29日GMT的偏差为+2小时(因为“夏令时”或技术上讲DST = Daylight Saving Time)。从2011年10月30日:03:00:00(顺便说一下下周日),在意大利他们将处于“冬季时间”(没有DST),因此抵消将为+1)。

所以你正确地得到了9月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)

答案 1 :(得分:0)

new Date(1317322560000l)

输出

Thu Sep 29 20:56:00 CEST 2011

与您的日历相同。为什么要18:56

答案 2 :(得分:0)

确实是 9 月 29 日星期四 20:56:00 GMT+02:00。即对应的 UTC 日期时间是 Thu Sep 29 18:56:00Z,其中 Z 代表祖鲁语,是零时区偏移量的 timezone designator({{1 }} 小时偏移量或 +00:00 时区)。

使用现代 API Etc/UTC 的解决方案

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));
    }
}

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


* 出于任何原因,如果您必须坚持使用 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

相关问题