Calendar.get(Calendar.DAY_OF_MONTH) 返回错误的一天

rwe*_*ser 4 java calendar java-7

当我运行以下代码时:

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));
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

可以看到,返回的值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。

Rob*_*sen 5

设置时区后只需设置日期值:

int year = 2017;
int month = Calendar.JULY;
int dayOfMonth = 10;

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.set(year, month, dayOfMonth);

System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
Run Code Online (Sandbox Code Playgroud)

这将正确输出月份中的日期:

DAY_OF_MONTH: 10
Run Code Online (Sandbox Code Playgroud)