JodaTime库的新功能,我想获得具有指定时区偏移量的DateTime毫秒字段。到目前为止,我的尝试是:
private DateTimeZone timeZone = DateTimeZone.forID("Europe/Amsterdam");
private long now=new DateTime().withZone(timeZone).getMillis();
但我总是得到 UTC 毫秒,不应用时区偏移量,有没有办法将时区的偏移量应用于日期时间对象?感谢!
首先:你打算用这些"本地"毫数做什么?你真正想要实现的目标是什么?通常只需要UTC-millis。
无论如何,请记住一般的时区偏移量定义,即:
UTC + 偏移量 = 本地时间
那么解决方案很简单:
DateTimeZone tz = DateTimeZone.forID("Europe/Amsterdam");
long nowUTC = new DateTime().withZone(tz).getMillis();
long nowLocal = nowUTC + tz.getOffset(nowUTC);
但再说一遍:"本地"毫秒的用例是什么?它们甚至不再与UNIX纪元相关,因为UTC链接被切断了。
关于您的最后一个问题("有没有办法将时区的偏移量应用于 DateTime 对象?
您的DateTime
对象已经有一个时区,即"欧洲/阿姆斯特丹"。它内部用于计算字段元组表示形式,一旦您有一个全局 UTC 时间戳表示为自 UNIX 纪元以来的 millis。无需在DateTime
上应用额外的偏移量。它已经在那里了。
JodaTime
内部正在使用机器时间。因此,要查找毫秒,您可以使用引用Jan 1, 1970
的常量存储LocalDateTime
(由于 UNIX 时间)。
Unix时间,或POSIX时间,是一个描述时间点的系统, 定义为自午夜外推以来经过的秒数 1970 年 1 月 1 日的协调世界时 (UTC),不包括飞跃 秒。
然后计算日期时间之间的差异。
我试过这样;
public static void main(String[] args) {
final LocalDateTime JAN_1_1970 = new LocalDateTime(1970, 1, 1, 0, 0);
DateTime local = new DateTime().withZone(DateTimeZone.forID("Europe/Amsterdam"));
DateTime utc = new DateTime(DateTimeZone.UTC);
System.out.println("Europe/Amsterdam milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.forID("Europe/Amsterdam")), local).getMillis());
System.out.println("UTC milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.UTC), utc).getMillis());
}
结果是;
Europe/Amsterdam milis :1429695646528
UTC milis :1429692046534
@leonbloy在这里写一个很好的评论。
您的本地和 UTC 代表相同的时间时刻,(仅使用 附上不同的时区)。因此,getMillis()(它给出了 从"瞬间"经过的"物理"时间间隔对应于 Unix 纪元),必须返回相同的值。
我也会寻找更好的解决方案,没有常数。