DateTime當我們從java.util.Datewith year構造它時,它似乎沒有用正確的日期初始化自己0001。
import java.time.LocalDateTime;
import java.util.TimeZone;
public class TestMain {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
java.util.Date d = new java.util.Date(-62135640000000L);
java.time.Instant i = java.time.Instant.ofEpochMilli(-62135640000000L);
System.out.println("d = new java.util.Date(-62135640000000L) : " new java.util.Date(-62135640000000L));
System.out.println("new org.joda.time.DateTime(d) : " new org.joda.time.DateTime(d));
System.out.println("new org.joda.time.DateTime(-62135640000000L) : " new org.joda.time.DateTime(-62135640000000L));
System.out.println("java.time.LocalDateTime.ofInstant(i, java.time.ZoneOffset.UTC): " LocalDateTime.ofInstant(i, java.time.ZoneOffset.UTC));
}
}
輸出:
d = new java.util.Date(-62135640000000L) : Sun Jan 02 12:00:00 UTC 1
new org.joda.time.DateTime(d) : 0000-12-31T12:00:00.000Z
new org.joda.time.DateTime(-62135640000000L) : 0000-12-31T12:00:00.000Z
java.time.LocalDateTime.ofInstant(i, java.time.ZoneOffset.UTC): 0000-12-31T12:00
除了時區相關的差異,如果你注意到:
- 日期
02在Date物件31中DateTime(或者00如果您更改為UTC) - 這一年是
0001在Date物件和0000在DateTime
我做錯了什么,還是這是一個錯誤?
做了一些更多的計算
62135640000000 / 1000 / 3600 / 24 / 365.25 = 1968.9596167008898015058179329227
0.9596167008898015058179329227 * 365.25 = 350.5
365.25 - 350.5 = 14.75
So -62135640000000= 負 1969 年零 350.5 天。或者在 0000 年開始后大約 14.75 天。
uj5u.com熱心網友回復:
不是錯誤:Julian 與 Proleptic 公歷
這不是錯誤。它是有意識地這樣設計的。這里有兩種不同的日歷系統:
- 過時的
java.util.Date類使用儒略歷來表示 1582 年之前的日期。它試圖反映當時歐洲大部分地區實際使用的日歷系統。 - Joda-Time 和 java.time 默認使用 ISO 8601 日歷系統(如果您明確指定,其他日歷系統也受支持)。ISO 8601 反過來使用預兆公歷。預測公歷是通過將公歷的規則外推回公歷被發明和引入之前的時代而創建的。所以它給出的日期與當時實際使用的日期不一致,但反過來,更明確。
對于大多數日期,這兩個日歷相隔幾天,當我們接近 1582 年或之后的儒略-格里高利交叉時,最多可能相隔幾周,具體取決于司法管轄區。
Joda-Time 支持公歷/儒略歷
DateJoda-TIme 也通過GJChronology該類支持使用的聯合公歷/儒安日歷系統。
DateTime dt = new DateTime(-62_135_640_000_000L,
GJChronology.getInstanceUTC());
System.out.println("DateTime with GJChronology: " dt);
輸出:
日期時間與 GJChronology:0001-01-02T12:00:00.000Z
年、月和月日都與您從Date.
鏈接
- Joda-Time 網站上的ISO8601 Java 日歷系統。
- 維基百科文章:ISO 8601
- 維基百科上的預兆公歷
- 類似問題:Java:如何在 UTC 中獲取“1000-01-01 00:00:00”的時間戳?不同的是,這個問題
ZonedDateTime來自 java.time,而不是 Joda-Time。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313652.html
上一篇:SQLBigQuery-如何將日期(2020-11-1416:04:15UTC)轉換為WEEKDAY值(0-6)
