java - 日历获取年份返回错误结果

标签 java android calendar

我想创建一个日历对象并将其设置为某一年和该年的某一周。

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/

相关文章:

java - 使用 PDFBox 并使用 Maven 构建时出现 NoClassDefFoundError

java - 安卓 : Table has no column named "variable name" MySql Database error

android - 在 java 中以编程方式对 Apk 文件进行签名

java - 如何从给定的 WEEK_OF_YEAR、DAY_OF_WEEK、YEAR 获取 Calendar.MONTH

database - 为日历应用程序布置数据库模式

java - Java中的全局变量

java - 从现有 channel 创建新的消息链

android - 将 fragment 宽度设置为屏幕宽度的百分比

Android Market 更新评论?

android - 在 native Android 日历上添加事件会导致 NullPointerException