当我运行下面的代码:Calendar.get(Calendar.DAY_OF_MONTH)返回错误的一天
int year = 2017;
int month = 7;
int dayOfMonth = 10;
Calendar dateOfBirth = new GregorianCalendar(year, month, dayOfMonth);
dateOfBirth.getTime(); // See http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490
dateOfBirth.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("Original Day Of Month:\t\t" + dayOfMonth);
System.out.println("Calendar:\t\t\t" + dateOfBirth);
System.out.println("Calendar substring:\t\t" + dateOfBirth.toString().substring(dateOfBirth.toString().indexOf("DAY_OF_MONTH"), dateOfBirth.toString().indexOf("DAY_OF_MONTH") + 15));
System.out.println("Formatted date:\t\t\t" + new SimpleDateFormat("dd").format(dateOfBirth.getTime()));
System.out.println("get(Calendar.DAY_OF_MONTH):\t" + dateOfBirth.get(Calendar.DAY_OF_MONTH));
我得到这样的输出:
Original Day Of Month: 10
Calendar: java.util.GregorianCalendar[time=1502312400000,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=7,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Calendar substring: DAY_OF_MONTH=10
Formatted date: 10
get(Calendar.DAY_OF_MONTH): 9
正如你所看到的,通过dateOfBirth.get(Calendar.DAY_OF_MONTH)
返回的值是不正确的。
我使用的UTC是因为它是出生日期,我不希望它依赖于特定的时区。为了正确地做到这一点,我需要致电dateOfBirth.getTime()
- 请参阅http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490。 如果我拿出那个电话,这个工作正常,但后来我遇到了其他的错误。
任何想法我可以做些什么来准确地得到正确的一个月的一天?
我正在使用Java v1.7.0_79,并且,万一它很重要,我目前处于GMT + 3。
我想第0天只是代表本月的第一天,因为您希望第10天输出第9天。如果您将日期输出格式化为dd-MM-yyyy,那么您将获得日历的javadoc所说的内容,因此10-08-2017 最后,请记住,在结构中,您必须添加1以回到人类约定,其中数字从1开始,而不是0 – Webster
@Webster月中的某天不从索引0开始。它从1开始。 –
我知道您正在使用Java 7,并且可能暂时不打算升级到Java 8。但是,如果您的程序正在处理日期和/或时区,请认真考虑获取[ThreeTen Backport](http://www.threeten.org/threetenbp/)并开始使用现代课程。通过'LocalDate'你知道日期是什么。一般来说,现代课程更适合工作,并且少有像这样的惊喜。如果最终你升级了你的Java版本,你将会做好充分的准备,因为这些类是在Java 8及更高版本中内置的。 –