这个非常简单的测试失败了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();
}
}
答案 0 :(得分:8)
这个日期和时间组合在您的时区中不存在,因为它会因夏令时而导致不连续。
由于您配置了setLenient(false)
,因此当您尝试输入不存在的日期时,Calendar
会正确抛出异常。
经验法则:如果你在日期和时间计算中看到一些奇怪的东西,可以怀疑夏令时。