tl;博士
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
了解您的数据
自epoch 以来,人们在跟踪时间中使用各种精度作为数字。因此,当您获得一些数字以解释为自一个纪元以来的计数时,您必须确定:
在您的情况下,正如其他人所指出的,自 Unix 时代以来,您似乎已经被给予了几秒钟的时间。但是您将这些秒数传递给期望毫秒的构造函数。所以解决方法是乘以 1,000。
经验教训:
您的数据
您的数据似乎以整秒为单位。如果我们假设 1970 年初的纪元,如果我们假设 UTC 时区,那么1,220,227,200 是 2008 年 9 月第一天的第一时刻。
乔达时间
Java 捆绑的 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。请改用 Joda-Time 库或 Java 8 中捆绑的新 java.time package(并受 Joda-Time 启发)。
请注意,与 j.u.Date 不同,Joda-Time 中的 DateTime 真正知道自己分配的 time zone。因此,在下面看到的示例 Joda-Time 2.4 代码中,请注意,我们首先使用 UTC 的默认假设解析毫秒。然后,其次,我们分配一个巴黎的时区进行调整。宇宙时间线上的同一时刻,但不同wall-clock time。为了演示,我们再次调整为 UTC。几乎总是更好地明确指定您想要/预期的时区,而不是依赖隐式默认值(通常是日期时间工作的麻烦原因)。
我们需要毫秒来构造一个 DateTime。因此,将您输入的秒数乘以一千。请注意,结果必须是 64 位 long,因为我们会溢出 32 位 int。
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
将该毫秒数提供给构造函数。该特定构造函数假定计数来自 1970 年的 Unix 纪元。因此,在构造之后根据需要调整时区。
使用proper time zone 名称,大陆和城市/地区的组合。切勿使用 3 或 4 字母代码,例如 EST,因为它们既不是标准化的也不是唯一的。
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
为了演示,再次调整时区。
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
转储到控制台。请注意蒙特利尔的日期有何不同,因为新的一天在欧洲已经开始,但在美国尚未开始。
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
运行时。
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Joda-Time 的制造商要求我们尽快迁移到它的替代品java.time 框架。虽然 Joda-Time 继续得到积极支持,但所有未来的开发都将在 ThreeTen-Extra 项目中的 java.time 类及其扩展上完成。
java-time 框架由JSR 310 定义并内置于Java 8 及更高版本。 java.time 类在ThreeTen-Backport 项目中被反向移植到Java 6 和7,在ThreeTenABP 项目中被移植到Android。
Instant 是UTC 时间线上的一个时刻,分辨率为纳秒。它的纪元是 1970 年 UTC 的第一个时刻。
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
申请offset-from-UTC ZoneOffset 以获得OffsetDateTime。
如果知道的话,最好应用一个时区ZoneId 来获得ZonedDateTime。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );