【发布时间】:2020-04-10 04:13:29
【问题描述】:
我希望这不是 JDK 错误,或者我很想兑现我所有的银行账户,然后把它扔到床垫里...... 这是代码。请注意,将日期设置为 12 月 29 日会立即将年份滚动到 2020 年。此外,toString() 输出显示 Calendar 似乎认为周数为“1”。
import java.util.*; // headers MUST be above the first class
import java.text.*;
public class JDKCalendarBug {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-YYYY kk:mm");
Calendar cal = java.util.Calendar.getInstance(TimeZone
.getTimeZone("EST"));
cal.clear();
cal.set(Calendar.YEAR, 2019);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 26);
Date t = cal.getTime();
System.out.print("\n"+sdf.format(t));
System.out.print("\n"+cal.toString());
cal.set(Calendar.DAY_OF_MONTH, 27);
t = cal.getTime();
System.out.print("\n"+sdf.format(t));
System.out.print("\n"+cal.toString());
cal.set(Calendar.DAY_OF_MONTH, 28);
t = cal.getTime();
System.out.print("\n"+sdf.format(t));
System.out.print("\n"+cal.toString());
cal.set(Calendar.DAY_OF_MONTH, 29);
t = cal.getTime();
System.out.print("\n"+sdf.format(t));
System.out.print("\n"+cal.toString());
}
}
输出:
12-26-2019 24:00 java.util.GregorianCalendar[time=1577336400000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="EST",offset=-18000000,dstSavings=0,useDaylight=false ,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=11,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=26,DAY_OF_YEAR=?,DAY_OF_WEEK=?, DAY_OF_WEEK_IN_MONTH=?,AM_PM=?,HOUR=?,HOUR_OF_DAY=?,MINUTE=?,SECOND=?,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
2019 年 12 月 27 日 24:00 java.util.GregorianCalendar[time=1577422800000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="EST",offset=-18000000,dstSavings=0,useDaylight=false ,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=4,DAY_OF_MONTH=27,DAY_OF_YEAR=361,DAY_OF_WEEK=6, DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0] 2019 年 12 月 28 日 24:00 java.util.GregorianCalendar[time=1577509200000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="EST",offset=-18000000,dstSavings=0,useDaylight=false ,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=11,WEEK_OF_YEAR=52,WEEK_OF_MONTH=4,DAY_OF_MONTH=28,DAY_OF_YEAR=362,DAY_OF_WEEK=7, DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0]
12-29-2020 24:00 java.util.GregorianCalendar[time=1577595600000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="EST",offset=-18000000,dstSavings=0,useDaylight=false ,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=363,DAY_OF_WEEK=1, DAY_OF_WEEK_IN_MONTH=5,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0]
【问题讨论】:
-
你有关于你的 JDK 和你的区域设置的信息吗?根据您的语言环境,一年中最后一周的周数可以是 1 或 52。您的语言环境也决定了 12 月 29 日的星期数
-
jre1.8.0_231:与 Eclipse 一起打包。按照您的指示,我使用“Locale.US”重新运行了代码,但得到了相同的结果。谢谢你的回复,弗雷德!
-
我建议你不要使用
Calendar、Date、TimeZone和SimpleDateFormat。这些类设计不良且过时,尤其是最后一个以麻烦着称。而是使用ZoneIdZonedDateTime和DateTimeFormatter,均来自java.time, the modern Java date and time API。
标签: java.util.date java.util.calendar