gpt4 book ai didi

java - 用 java.util.Calendar 添加天数会产生奇怪的结果

转载 作者:行者123 更新时间:2023-11-30 06:33:47 27 4
gpt4 key购买 nike

使用 java.util.Calendar 将一天添加到日期,并使用 SimpleDateFormat 显示结果,有时似乎会少一天(一般在三月),有时会跳过一天(在十一月)。

下面的程序和输出说明了这个问题。请注意,我只是一次添加一天,然后跳过几个月,再添加几天。您会看到 2008-03-09 被打印了两次,但 2008-11-02 被跳过了。同样的事情发生在其他年份,但在不同的日子。我不得不通过试验找出导致问题的日子。

如果我没有在 SimpleDateFormat 中将时区设置为 UTC,那么问题就不会发生。我在美国中部时区的一台机器上运行了这个。

这看起来确实像是 Calendar 或 SimpleDateFormat 中的错误,但我无法在任何地方找到它的文档。有人对这里发生的事情有解释吗?

程序:

package mab;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class CalendarHiccup2 {

public static void main(String[] args) {
addDays("2008-03-08");
addDays("2009-03-07");
addDays("2010-03-13");
}

public static void addDays(String dateString) {
System.out.println("Got dateString: " + dateString);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(dateString));
Date day1 = calendar.getTime();
System.out.println(" day1 = " + sdf.format(day1));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day2 = calendar.getTime();
System.out.println(" day2 = " + sdf.format(day2));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day3 = calendar.getTime();
System.out.println(" day3 = " + sdf.format(day3));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day4 = calendar.getTime();
System.out.println(" day4 = " + sdf.format(day4));

// Skipping a few days ahead:
calendar.add(java.util.Calendar.DAY_OF_MONTH, 235);
Date day5 = calendar.getTime();
System.out.println(" day5 = " + sdf.format(day5));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day6 = calendar.getTime();
System.out.println(" day6 = " + sdf.format(day6));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day7 = calendar.getTime();
System.out.println(" day7 = " + sdf.format(day7));

calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
Date day8 = calendar.getTime();
System.out.println(" day8 = " + sdf.format(day8));

} catch (Exception e) {
}
}

}

输出:

Got dateString: 2008-03-08
day1 = 2008-03-08
day2 = 2008-03-09
day3 = 2008-03-09
day4 = 2008-03-10
day5 = 2008-10-31
day6 = 2008-11-01
day7 = 2008-11-03
day8 = 2008-11-04
Got dateString: 2009-03-07
day1 = 2009-03-07
day2 = 2009-03-08
day3 = 2009-03-08
day4 = 2009-03-09
day5 = 2009-10-30
day6 = 2009-10-31
day7 = 2009-11-02
day8 = 2009-11-03
Got dateString: 2010-03-13
day1 = 2010-03-13
day2 = 2010-03-14
day3 = 2010-03-14
day4 = 2010-03-15
day5 = 2010-11-05
day6 = 2010-11-06
day7 = 2010-11-08
day8 = 2010-11-09

最佳答案

这是由 daylight saving time 引起的并且是完全正确的。

时间(在北半球)通常在 3 月提前一小时,并在 11 月后移。

关于java - 用 java.util.Calendar 添加天数会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691855/

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