我对日期有疑问。
我确定这些毫秒 1317322560000 代表意大利 2011 年 9 月 29 日星期四 18:56:00 GMT+02:00 的日期。
但是使用 Calendar 类,日期是 Thu Sep 29 20:56:00 GMT+02:00。我认为发生这种情况是因为夏季时间表已经生效。
如何将毫秒转换为相应的日期?
System.currentTimeMillis() 返回“当前时间与 1970 年 1 月 1 日 UTC 午夜之间的差异,以毫秒为单位。” (即格林威治标准时间)。
因此,您拥有的“日期”1317322560000 是格林威治标准时间 29/09/2011:18:56:00。在意大利,9 月 29 日与 GMT 的偏移量为 +2 小时(因为“夏令时”或从技术上讲 DST =夏令时)。从 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)
new Date(1317322560000l)
输出
Thu Sep 29 20:56:00 CEST 2011
和你的日历一样。为什么会这样18:56
?
确实是Thu Sep 29 20:56:00 GMT+02:00。即,UTC 中的相应日期时间是Thu Sep 29 18:56:00Z,其中Z
代表 Zulu,并且是零时区偏移(小时偏移或时区)的时区指示符。+00:00
Etc/UTC
java.time
现代 API 的解决方案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了解有关现代日期时间 API *的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。