在这两种情况下,我想在此示例中以毫秒为单位设置的日期是 1395227280627
,人类可读格式是 3/19/2014 12:08:00 PM
1) 这是第一种方法,它不能正常工作:
Calendar ret1=GregorianCalendar.getInstance();
ret1.set(Calendar.YEAR, year);
ret1.set(Calendar.MONTH, month);
ret1.set(Calendar.DAY_OF_YEAR, day);
ret1.set(Calendar.HOUR_OF_DAY, hour);
ret1.set(Calendar.MINUTE, minute);
ret1.set(Calendar.SECOND, 0);
Log.e("Time in millis:", Long.toString(ret1.getTimeInMillis()));
此方法的输出为 1390129680626
,以毫秒为单位,人类可读格式为 1/19/2014 12:08:00 PM
。问题是月份设置不正确。
2) 第二种正确的方法是:
Calendar ret2=GregorianCalendar.getInstance();
ret2.set(year, month, day, hour, minute, 0);
Log.e("Time in millis:", Long.toString(ret2.getTimeInMillis()));
这种方法的输出是 1395227280627
以毫秒为单位,3/19/2014 12:08:00 PM
是人类可读的格式,这正是我想要的。我很好奇出了什么问题,经过一些研究,很多人都说 java 日历很糟糕,并且有很多非常奇怪的东西,包括一些损坏的部分。我已经开始回溯有效的方法,结果如下:
回溯calendar.set(year, month, day, hour, minute, second)
/**
* Sets the year, month, day of the month, hour of day, minute, and second fields.
* Other fields are not changed; call {@link #clear} first if this is not desired.
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
*/
public final void set(int year, int month, int day, int hourOfDay, int minute, int second) {
set(year, month, day, hourOfDay, minute);
set(SECOND, second);
}
所以 second
部分转换为我在第一种方法中所做的,检查。
回溯 calendar.set(year, month, day, hourOfDay, minute)
/**
* Sets the year, month, day of the month, hour of day, and minute fields.
* Other fields are not changed; call {@link #clear} first if this is not desired.
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
*/
public final void set(int year, int month, int day, int hourOfDay, int minute) {
set(year, month, day);
set(HOUR_OF_DAY, hourOfDay);
set(MINUTE, minute);
}
所以 hourOfDay
和 minute
部分转换为我在第一种方法中所做的,检查。
回溯calendar.set(year, month, day)
/**
* Sets the year, month, and day of the month fields.
* Other fields are not changed; call {@link #clear} first if this is not desired.
* The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
*/
public final void set(int year, int month, int day) {
set(YEAR, year);
set(MONTH, month);
set(DATE, day);
}
所以 year
、month
和 day
部分完全转换为我在第一种方法中所做的。
结论是,我在第一种方法中进行的每次调用都以完全相同的方式在第二种方法中被调用,所以我不明白发生了什么。谁能帮我解决这个问题,并解释为什么会这样?
最佳答案
我认为问题在于您使用了错误的日历设置来设置日期
ret1.set(Calendar.DAY_OF_YEAR, day);
对应于 1-365 之间的数字(即设置为 19 将有效地将月份设置为 1 月 19 日)
我觉得你想要
ret1.set(Calendar.DAY_OF_MONTH, day);
关于java - 为什么其中一种方法适用于设置日期,而另一种方法则不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22502709/