小编Bla*_*oid的帖子

如何在不转换的情况下将 unix 时间戳转换为 LocalDate(Time)

我正在使用 org.joda.time.LocalDate 和 LocalDateTime。我从外部来源获得了一个 Unix 时间戳,并希望从中生成一个 LocalDate(Time)。关键是,它在该外部系统的界面中定义,所有日期/时间都在 UTC 时区。所以我想避免从该时间戳到本地系统的任何默认时区的任何隐式转换,这可能与 UTC 不同。对于此类事情,有一个 LocalDateTime 的构造函数,所以我尝试了(例如):

System.out.println(new LocalDateTime(3600000L));
  --> 1970-01-01T02:00:00.000

System.out.println(new LocalDateTime(3600000L, DateTimeZone.UTC));
  --> 1970-01-01T01:00:00.000
Run Code Online (Sandbox Code Playgroud)

结果有点出乎我的意料。查看 JavaDoc,第一个构造函数评估时间戳“在默认区域中使用 ISO 年表”。根据定义,Unix 时间戳是从 01-JAN-1970T00:00:00UTC 开始的秒数(这里是毫秒)!因此,如果将值 3600000(= 恰好 2 小时(以毫秒为单位)添加到该基数中,它将变为 01-JAN-1970T02:00:00UTC。我的本地系统设置为欧洲/柏林 (CET) 时区,即 UTC+1。准确地说,我们现在有夏令时,所以它甚至应该是 UTC+2,但让我们假设我们现在处于 UTC+1。因此,如果时间戳根据定义是 UTC,那么我希望结果时间是 01:00:00,如果它将时间戳的值解释为转换为 UTC 的 CET,或者 03:00:00 如果它正确地期望时间戳具有转换为 CET 的 UTC 值。但它实际上显示了一个未转换的时间戳,正好偏离基地 2 小时。第二个构造函数应该评估“在指定区域中使用 ISO 年表”的时间戳。(来自 JavaDoc)因此,如果我明确指定 UTC 时区,我根本不会期望任何转换,而是 02:00:00 的时间。一个基于 UTC 的时间戳会导致一个本身被声明为 UTC 的时间,结果应该是这样,但结果是 01:00:00!只是为了仔细检查,我用 CET 显式调用它并得到相同的结果,就好像我不提供任何时区一样。(来自 JavaDoc)因此,如果我明确指定 UTC 时区,我根本不会期望任何转换,而是 02:00:00 的时间。一个基于 UTC 的时间戳会导致一个本身被声明为 UTC 的时间,结果应该是这样,但结果是 01:00:00!只是为了仔细检查,我用 CET 显式调用它并得到相同的结果,就好像我不提供任何时区一样。(来自 JavaDoc)因此,如果我明确指定 UTC …

java jodatime unix-timestamp

5
推荐指数
2
解决办法
2万
查看次数

标签 统计

java ×1

jodatime ×1

unix-timestamp ×1