【发布时间】:2019-07-18 02:01:45
【问题描述】:
我有一个日历实例,它从 12 月的第一天开始。我正在尝试将该日历实例设置为一年中的最后一个星期二。在设置一年中的最后一天和星期几之间的某个地方,Calendar 实例恢复到原始时间:
Calendar cal = ....;
Log.d(TAG, String.format("Starting here %d-%d-%d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH)));
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
Log.d(TAG, String.format("Ending here %d-%d-%d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH)));
/* Other stuff */
给我 2017 年和 2018 年的输出:
2017:
Starting here 2017-12-1
Ending here 2017-11-28
2018 年:
Starting here 2018-12-1
Ending here 2018-11-27
一个不满意的修复
但是,如果我从 Calendar 实例中检索数据,它可以正常工作:
Calendar cal = ....;
Log.d(TAG, String.format("Starting here %d-%d-%d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH)));
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
// Ask the Calendar instance for information
long dummyValue = cal.getTimeInMillis();
cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
Log.d(TAG, String.format("Ending here %d-%d-%d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH)));
/* Other stuff */
给我 2017 年和 2018 年的输出:
2017:
Starting here 2017-12-1
Ending here 2018-1-2
2018 年:
Starting here 2018-12-1
Ending here 2019-1-1
是的,我知道第二组值的日期不是上周二。这就是/* Other stuff */ 的用途。
【问题讨论】:
-
考虑丢弃长期过时且设计不佳的
Calendar,并将ThreeTenABP 添加到您的Android 项目中,以便使用java.time,现代Java 日期和时间API。与它一起工作要好得多。我相信观察到的行为已记录在案。Calendar只是令人困惑,有时非常令人困惑。
标签: android calendar java.util.calendar