当我运行以下代码段时:
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
public class TimestampTest {
public static void main(String... args) throws Exception {
Date aDate1880 = new Date(-20, 0, 1);
Timestamp timestamp = new Timestamp(aDate1880.getTime());
DateTime dateTime = new DateTime(timestamp).withZoneRetainFields(DateTimeZone.getDefault());
System.out.println(dateTime.year().get());
Calendar calendar = Calendar.getInstance();
calendar.setTime(timestamp);
System.out.println(calendar.get(Calendar.YEAR));
}
}
我将获得以下输出:
1879
1880
作为aDate1880
的确代表了1880年,我不知道为什么Joda DateTime
年将为1879年。
此代码:
Date aDate1880 = new Date(-20, 0, 1);
创建一个相当于1880年1月1日的Date
。由于未提供时间字段,它们设置为午夜的JVM Default TimeZone。就我而言,这是"美国/sao_paulo",因此以下结果在您的情况下可能有所不同 - 但无论如何都可以解释发生了什么。就我而言,创建的日期是:
thu 1月1日00:00:00 BRT 1880
(1880年1月1日在美国午夜/sao_paulo时区 - BRT表示"巴西时间"(
调用aDate1880.getTime()
返回值-2840130000000
,该值在UTC中对应于1880-01-01T03:00:00Z
。
转换为DateTime
时,它使用Joda Time内部时区数据,在我的情况下,DateTime
是:
1879 -12-31T23:53:32.000-03:06:28
那是因为在1900年之前,许多国家没有使用当前的时区规则,大多数城市都有自己的当地时间。大多数偏移是根据经度来计算的,这就是为什么它具有>&quot'-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 Time类:
// January 1st 1880, at midnight in JVM default timezone
DateTime d = new LocalDate(1880, 1, 1).toDateTimeAtStartOfDay();