Calendar.getTime() 中奇怪的 IllegalArgumentException

2024-04-16

这个非常简单的测试失败了IllegalArgumentException("HOUR_OF_DAY 2 -> 3"),我看不出有什么理由。您可以将任何小时、天、月、年更改为任何其他值,测试就会成功。我测试过的任何 JRE 均失败。似乎是 GregorgianCalendar 实现中的内部问题?或者我错过了一些明显的东西?

import java.util.Calendar;

public class DateTest extends TestCase
{
    /** test if 2011/03/27 02:30:00 converts to a valid date.
     * shouldn't throw any exception, however this throws 
     * IllegalArgumentException("HOUR_OF_DAY 2 -> 3)
     */
    @Test
    public void testDate()
    {
        Calendar cal = Calendar.getInstance();
        cal.setLenient(false);
        cal.clear();
        cal.set(Calendar.SECOND, 00);
        cal.set(Calendar.MINUTE, 30);
        cal.set(Calendar.HOUR_OF_DAY, 02);
        cal.set(Calendar.DAY_OF_MONTH, 27);
        cal.set(Calendar.MONTH, 03 - 1); // needs to be 0-based
        cal.set(Calendar.YEAR, 2011);
        cal.getTime();
    }
}

您的时区中不存在此日期和时间组合,因为它因夏令时而陷入不连续性。

既然你配置了setLenient(false), Calendar当您尝试输入不存在的日期时,正确地引发异常。

经验法则:如果您在日期和时间计算中发现奇怪的情况,请怀疑夏令时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Calendar.getTime() 中奇怪的 IllegalArgumentException 的相关文章

随机推荐