gpt4 book ai didi

java - Joda 日期时间问题与年份

转载 作者:行者123 更新时间:2023-12-02 11:40:12 30 4
gpt4 key购买 nike

当我运行以下代码片段时:

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 默认时区的午夜。就我而言,它是“America/Sao_Paulo”,因此下面的结果可能与您的情况不同 - 但它无论如何都会解释发生了什么。就我而言,创建日期是:

Thu Jan 01 00:00:00 BRT 1880

(January 1st 1880 at midnight in America/Sao_Paulo timezone - BRT means "Brazilian Time")

调用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" 这样奇怪的结果。

您的时区可能也有类似的问题。

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

关于java - Joda 日期时间问题与年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48635481/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com