我想创建一个日历对象并将其设置为某一年和该年的某一周。
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear); // 1
calendar.set(Calendar.YEAR, year); // 2016
setWeekChecked(calendar);
这是我将日历对象传递给 setWeekChecked 方法时的 toString:
java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=America/New_York,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=7,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=5,HOUR_OF_DAY=5,MINUTE=25,SECOND=43,MILLISECOND=219,ZONE_OFFSET=-18000000,DST_OFFSET=0]
在setWeekChecked方法中:
public void setWeekChecked(final Calendar cal) {
final int targetWeek = cal.get(Calendar.WEEK_OF_YEAR); // Returns 1
final int targetYear = cal.get(Calendar.YEAR); // Returns 2015??
}
现在这是日历对象的 toString:
java.util.GregorianCalendar[time=1451557543219,areFieldsSet=true,lenient=true,zone=America/New_York,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=31,DAY_OF_YEAR=365,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=0,HOUR=5,HOUR_OF_DAY=5,MINUTE=25,SECOND=43,MILLISECOND=219,ZONE_OFFSET=-18000000,DST_OFFSET=0]
我做错了什么?
最佳答案
我怀疑日历正在尝试使用 2016 年第一周的当前星期几(今天是星期四)。
现在,查看您的日历设置,您已得到firstDayOfWeek=1(因此周从周日到周六)和minimalDaysInFirstWeek=1(因此一年中的第一周包括1 月1 日)。
这意味着您的日历中 2016 年的第一周是从 2015 年 12 月 27 日到 2016 年 1 月 2 日。因此第一周的星期四是 12 月 31 日 - 这正是您向我们展示的日历上显示的内容。
从根本上讲,“一年中的一周”的日历算术很棘手,因为:
- 有许多不同的文化特定方式来看待它们
- 通常要求不会指定您真正感兴趣的内容
如果可能的话,我强烈建议使用 Joda Time 来使您的日期/时间处理代码更清晰,但您仍然需要准确弄清楚您的意思“将其设置为某一年和该年的一周”。请注意,Joda Time 将“周-年”(与 week-of-week-year 和 day-of-week 一起使用)和“year”(与月和 day-of-month 一起使用)的概念分开,这有很大帮助。您需要注意,对于给定日期,周年和年份可能不同。
关于java - 日历获取年份返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652797/