tl;博士
Instant.ofEpochMilli( 1_360_753_217_219L ) // UTC
2013-02-13T11:00:17.219Z
Instant.ofEpochMilli( 1_360_753_217_219L )
.atZone( ZoneId.of( "Europe/Istanbul" ) ) // Same moment, two hours *ahead* of UTC.
2013-02-13T13:00:17.219+02:00[欧洲/伊斯坦布尔]
Instant.ofEpochMilli( 1_360_753_217_219L )
.atZone( ZoneId.of( "America/Caracas" ) ) // Same moment, four-and-a-half hours *behind* UTC.
2013-02-13T06:30:17.219-04:30[美国/加拉加斯]
使用 java.time
您正在使用与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类。它们现在是遗留的,被 java.time 类取代,这是任何平台上最好的日期时间库。
从自 1970 年初的 epoch reference date 到 UTC (1970-01-01T00:00:00Z) 的毫秒数开始。其他人指出,您可能不知道纪元参考日期有一个时区,而在这个纪元中,该时区是 UTC,偏移量为零。所有其他偏移量都根据这个偏移量来衡量,比 UTC 早或晚 UTC 小时数和分钟数。
Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
long input = 1_360_753_217_219L ;
Instant instant = Instant.ofEpochMilli( input ) ;
instant.toString(): 2013-02-13T11:00:17.219Z
如果您想通过特定地区的wall-clock time 的镜头看到同一时刻,请应用时区。
时区是特定区域使用的偏移量的过去、现在和未来变化的历史记录。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId zEurope_Istanbul = ZoneId.of( "Europe/Istanbul" ) ;
ZonedDateTime zdtEurope_Istanbul = instant.atZone( zEurope_Istanbul ) ;
zdtEurope_Istanbul.toString(): 2013-02-13T13:00:17.219+02:00[欧洲/伊斯坦布尔]
您可以应用其他时区。
ZoneId zAmerica_Caracas = ZoneId.of( "America/Caracas" ) ;
ZonedDateTime zdtAmerica_Caracas = zdtEurope_Istanbul.withZoneSameInstant( zAmerica_Caracas ) ;
zdtAmerica_Caracas.toString(): 2013-02-13T06:30:17.219-04:30[美国/加拉加斯]
看到这个code live at IdeOne.com。
instant 和 zdtEurope_Istanbul 和 zdtAmerica_Caracas 这三个对象都代表同一时刻,时间轴上的同一点。
您的从纪元计数表示 UTC 时间上午 11 点。伊斯坦布尔比 UTC提前 两个小时,因此同一时刻的时间是上午 11 点、下午 1 点 (13:00) 之后的两个小时。委内瑞拉比世界标准时间晚四个半小时,因此同一时刻的时间是早上 6:30。这些都是有道理的,都是同一时刻,但挂钟时间不同。
ISO 8601
不要使用 count-from-epoch 来交换或存储日期时间值。这是容易出错的,人类不可能有意义地阅读,并且由于各种软件系统和不同粒度(整秒、毫秒、微秒、纳秒等)使用至少几十个纪元参考日期而模棱两可。 )。
在 JVM 之外传递日期时间值时,使用标准的 ISO 8601 格式进行文本表示。 java.time 类在解析/生成字符串时默认使用标准格式。您可以在此答案的示例代码中看到这些格式。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。