gpt4 book ai didi

java - GregorianCalendar 给出了 "Asia/Singapore"时区的意外结果,系统日期为 2014 年 1 月 30 日

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:40 30 4
gpt4 key购买 nike

我面临与 GregorianCalendar 相关的问题。

先决条件: 系统时区是:“亚洲/新加坡” 系统时间为:2014年1月30日

执行代码:

 Calendar cal = new GregorianCalendar();
TimeZone tz = TimeZone.getTimeZone("Asia/Singapore");
cal.setTimeZone(tz);
cal.set(Calendar.MONTH, 1);//1 is equivalent to Feb
cal.get(Calendar.YEAR);
cal.set(Calendar.YEAR, 2014);
cal.get(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, 5);
Date dte=cal.getTime();

实际结果:2014年3月5日

预期结果:2014 年 2 月 5 日

但是,如果我执行相同的代码并更改顺序,则会产生正确的值:

 Calendar cal = new GregorianCalendar();
TimeZone tz = TimeZone.getTimeZone("Asia/Singapore");
cal.setTimeZone(tz);
cal.get(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, 5);
cal.set(Calendar.MONTH, 1);//1 is equivalent to Feb
cal.get(Calendar.YEAR);
cal.set(Calendar.YEAR, 2014);

它给出了正确的结果

有人可以帮助我了解这个问题的根本原因吗?

最佳答案

在 1 月 30 日运行代码时,这将是日历的初始状态。 cal.set(Calendar.MONTH, 1); 然后会将日历设置为 2 月 30 日。当调用 cal.get(DAY_OF_MONTH) 时,日历的内部状态将被重新计算以获得正确的日期。因此,由于 cal.isLenient() 为 true,因此 2 月 30 日将转换为 3 月 2 日。然后将日期设置为 30 将得到 3 月 30 日。

尝试在创建日历后添加 cal.setLenient(false) 并查看代码的第一个版本如何失败...

要修复代码,请在日历处于中间状态时删除 get cal.get() 语句,以避免过早重新计算。

编辑:添加了有关cal.get()的部分

关于java - GregorianCalendar 给出了 "Asia/Singapore"时区的意外结果,系统日期为 2014 年 1 月 30 日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881062/

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