我想将转换java.util.Date到JodaTime以开展日期之间的减法.是否有一个很好的简洁方式转换Date为JodaTime?
我注意到 java 中日期和时间的奇怪行为。我有以下代码:
public class TestDateTime {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Helsinki"));
Calendar calendar = GregorianCalendar.getInstance();
assert(calendar.getTimeZone().equals(TimeZone.getDefault()));
//Set 1899-12-30T23:00:00
calendar.set(1899,11,30,23,0,0);
calendar.set(Calendar.MILLISECOND,0);
long timeInMillis = calendar.getTimeInMillis();
java.util.Date calendarDateTime = new java.util.Date(timeInMillis);
LocalDateTime localDateTime = LocalDateTime.ofInstant(ofEpochMilli(timeInMillis), ZoneId.systemDefault());
System.out.println("Time in millis: " + timeInMillis);
System.out.println("Date: " + calendarDateTime.toString());
System.out.println("Local DateTime: " + localDateTime.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Time in millis: -2209086000000
Date: Sat Dec 30 23:00:00 EET 1899
Local DateTime: 1899-12-30T22:39:49
Run Code Online (Sandbox Code Playgroud)
timeInMillis 必须包含从 传递的毫秒数1970-01-01T00:00:00Z。Date 类的实例存储从 传递的毫秒数1970-01-01T00:00:00Z。
Date.toString()方法返回默认时区的本地日期和时间。 …
在我的客户端,我有这个代码:
System.out.println("Java tz: " + TimeZone.getDefault());
System.out.println("Joda tz: " + ISOChronology.getInstance());
Run Code Online (Sandbox Code Playgroud)
这两条线一个接一个地运行.我从不设置时区或user.timezone手动,只依赖于从操作系统和本地系统读取的默认值.
执行时,它们会产生:
Java tz: sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Joda tz: ISOChronology[America/Phoenix]
Run Code Online (Sandbox Code Playgroud)
系统时区确实是凤凰城,而不是UTC.Joda怎么能正确,JDK错了?
编辑:这是一个Windows 7 x64主机,JRE是1.6.22 x64.
编辑2:不要试图重现它.它只会在某些系统上失败,而不是所有系统(就像我们的3k用户群中的几十个).我已经知道了Joda检查user.timezone然后TimeZone.getDefault().所以我正在寻找一个解释,说明我TimeZone直接打电话和Joda独自完成之间有什么不同.