有人可以向我解释joda DateTime时区的工作原理吗?我有:
public static void main(String[] args) {
DateTime utc = new DateTime(new Date()).withZone(DateTimeZone.UTC);
DateTime nonUtc = new DateTime(new Date());
long l = DateTimeZone.UTC.convertLocalToUTC(new Date().getTime(), false);
DateTime converted = new DateTime(l);
System.out.println("UTC :"+utc.toDate() + " , time zone :"+utc.getZone().getID());
System.out.println("Non UTC :"+nonUtc.toDate()+ " , time zone :"+nonUtc.getZone().getID());
System.out.println("Converted :"+converted.toDate()+ " , time zone :"+converted.getZone().getID());
}
此输出如下。本地默认时区是欧洲/雅典
UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :UTC
Non UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens
Converted :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens
我可以理解,第一个用UTC创建一个new Date()
,我的默认TZ是时间,第二个用默认TZ创建new Date()
,但为什么不是最后一行将当地时间转换为UTC?
答案 0 :(得分:0)
在我看来,你不应该尝试使用DateTimeZone.convertLocalToUTC()。它对框架内部时区计算非常有用。我建议不要将此方法用于任何其他用例,因为它的签名非常混乱。长参数旨在成为每个API的本地即时。但是,在大多数日期时间库的背景下,瞬间通常被认为是绝对的全局瞬间(即使在Joda-Time中,如果你看一下它的类Instant
)。另一个重要原因:查看long参数无法告诉我们这是一个本地参数还是全局参数(类型long
不传输此信息)。您总是需要上下文来决定本地或全球。
现在是你“问题”的真正核心。 您对此方法的输入不是本地的,而只是一个全局瞬间(使用new Date().getTime()
),因此不会发生真正的转换。以下行new DateTime(l);
仍将使用您的默认时区基于同一个全球瞬间。