向java.util.Calendar添加一年时的奇怪结果

Dmi*_*lov 4 java date kotlin

初始化java.util.CalendarMay, 31 1900.然后再加一年二十次.

这是代码:

import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*

fun main(args : Array<String>) {
    val f = SimpleDateFormat("yyyy.dd.MM")
    val cal = Calendar.getInstance()
    cal.set(1900, Calendar.MAY, 31)
    for(i in 1..20) {
        println(f.format(cal.time))
        cal.add(Calendar.YEAR, 1)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

1900.31.05
1901.31.05
1902.31.05
1903.31.05
1904.31.05
1905.31.05
1906.31.05
1907.31.05
1908.31.05
1909.31.05
1910.31.05
1911.31.05
1912.31.05
1913.31.05
1914.31.05
1915.31.05
1916.31.05
1917.31.05
1918.01.06
1919.01.06
Run Code Online (Sandbox Code Playgroud)

为什么我从1918年开始到6月1日而不是5月31日?

UPD:有时间信息

1917.31.05 23:38:50.611
1918.01.06 01:38:50.611
Run Code Online (Sandbox Code Playgroud)

如果这是DST的发明,我该如何预防呢?

Daw*_*ica 8

您似乎在一个时区中运行您的代码,该时区在1917年或1918年将其偏移量改变了两个小时.也就是说,UTC前后的小时数发生了变化.我不知道为什么你的时区会这样做,但我确信它有一个很好的历史原因.

如果您只对日期感兴趣而没有时间组件,请使用java.time.LocalDate该类,该类实际上仅代表日,月和年.它不受任何夏令时异常的影响.

LocalDate today = LocalDate.now(); 
Run Code Online (Sandbox Code Playgroud)

要么

LocalDate moonLanding = LocalDate.of(1969, 7, 20);
Run Code Online (Sandbox Code Playgroud)