此代码:
Date aDate1880 = new Date(-20, 0, 1);
创建
Date
相当于1880年1月1日。由于没有提供时间字段,因此在JVM默认时区将其设置为午夜。在我的例子中,它是“美国/圣保罗”,所以下面的结果在你的例子中可能不同,但它可以解释到底发生了什么。在我的情况下,创建日期为:
1月1日星期四00:00:00 BRT 1880
(1880年1月1日午夜,美国/圣保罗时区-BRT表示“巴西时间”)
使命感
aDate1880.getTime()
返回值
-2840130000000
,在UTC中对应于
1880-01-01T03:00:00Z
.
转换为时
DateTime
,它使用joda时间内部时区数据,在我的例子中
日期时间
是:
1879
-12-31T23:53:32.000-03:06:28
这是因为在1900年之前,许多国家没有使用现行的时区规则,大多数城市都有自己的当地时间。大多数偏移量是基于经度计算的,这就是为什么它会有这样奇怪的结果
"-03:06:28"
.
可能你的时区也有类似的问题。
注:
new DateTime(timestamp)
已使用默认时区,因此调用
withZoneRetainFiels
是冗余的:
DateTime dateTime = new DateTime(timestamp);
// this prints "true"
System.out.println(dateTime.equals(dateTime.withZoneRetainFields(DateTimeZone.getDefault())));
要创建所需的日期,只能使用Joda时间类:
// January 1st 1880, at midnight in JVM default timezone
DateTime d = new LocalDate(1880, 1, 1).toDateTimeAtStartOfDay();