Java Joda DateTime发行年份

Java Joda DateTime发行年份,java,date,timestamp,jodatime,date-conversion,Java,Date,Timestamp,Jodatime,Date Conversion,当我运行以下代码段时: 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 {

当我运行以下代码段时:

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日的日期。由于未提供时间字段,因此在JVM默认时区将其设置为午夜。在我的例子中,它是“美国/圣保罗”,所以下面的结果在你的例子中可能会有所不同——但它可以解释到底发生了什么。就我而言,创建日期为:

星期四一月一日00:00:00快速公交1880

(1880年1月1日美国/圣保罗时区午夜——BRT的意思是“巴西时间”)

调用
aDate1880.getTime()
返回值
-2840130000000
,该值在UTC中对应于
1880-01-01T03:00:00Z

转换为
DateTime
时,它使用joda time内部时区数据,在我的例子中,
DateTime
是:

1879-12-31T23:53:32.000-03:06:28

这是因为在1900年之前,许多国家没有使用现行的时区规则,大多数城市都有自己的当地时间。大多数偏移量是基于经度计算的,这就是为什么它会有如此奇怪的结果,比如“-03:06:28”

也许你的时区也有类似的问题

注意:
newdatetime(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();

aDate1980
是1880年(1月1日)
Date(int year,int month,int Date)
的第一个参数是“年份减去1900”。从JDK 1.1开始,它也被弃用。当“切换时区”(默认值?…保留所有其他值)时,1879年很容易发生……我很确定它大约在12月31日左右;)@xerx593即使我不使用
。WithZoneReainFields(DateTimeZone.getDefault())
它仍然提供1879nice…然后是
系统.out.println(dateTime.toString())提供更多信息…谷歌查询将导致