Nexus 7 4.2上的Android Java日期日期WEEK_OF_YEAR问题

时间:2013-01-18 08:58:41

标签: java android calendar nexus-7 android-4.2-jelly-bean

好的,所以这个让我很难过。 我有以下代码尝试创建此字符串:

  

产出:52。2012年(12月24日至12月30日)

这是2012年第52周的开始和结束,周一是本周的第一天。

private Date getDateObject() {
    Calendar cld = Calendar.getInstance();
    cld.set(Calendar.YEAR, year);
    cld.set(Calendar.WEEK_OF_YEAR, week);
    cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    return cld.getTime();
}

private Date getEndDateObject() {
    Calendar cld = Calendar.getInstance();

    if (week < 52) {
        cld.set(Calendar.YEAR, year);
        cld.set(Calendar.WEEK_OF_YEAR, week + 1);
    } else {
        cld.set(Calendar.YEAR, year + 1);
        cld.set(Calendar.WEEK_OF_YEAR, 1);
    }

    cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
    return cld.getTime();
}

public String getDateRangeString() {
    String pattern = "d MMM";
    SimpleDateFormat formatter = new SimpleDateFormat(pattern); 

    Date startDate = getDateObject();
    Date endDate = getEndDateObject();

    String startDateFormatted = formatter.format(startDate);
    String endDateFormatted = formatter.format(endDate);

    String dateString = "" + this.week + ". " + this.year + " (" + startDateFormatted + " to " + endDateFormatted + ")";
    return dateString;
}

在YEAR = 2012和WEEK = 52的对象上使用函数getDateRangeString在以下设备上给出以下输出:

  • Nexus S - 4.1
  • 模拟器4.1
  • Emulator 4.2
  

产出:52。2012年(12月24日至12月30日)

哪个是对的!

但是在运行4.2.1的Nexus 7上我得到了:

  

产出:52。2012年(12月24日至1月6日)

WTF !!?!?

所有设备都设置为澳大利亚EST +10并且现在有正确的时间/日期。 我认为这与4.2中失踪的12月份有任何关系,无论如何都应该在4.2.1中修复。

当我调试它时,日历表明它具有所有正确的值。 然后出现在1月6日?

我的意思是它是一个奇怪的,因为12月31日就像第53周或者其他什么? 我不知道,我只是不明白为什么这个设备有任何不同。

1 个答案:

答案 0 :(得分:2)

好的,首先要感谢Jon Skeet建议增加6天才能到达本周末以避免各种问题。这绝对是最佳选择。

因此,为了将来参考,请避免使用Java Calendar / Date。 但我偶然让我的代码在每个设备/平台上运行。

这是我修改后的代码:

private Date getDateObject() {
    Calendar cld = Calendar.getInstance();
    cld.set(Calendar.YEAR, year);
    cld.set(Calendar.WEEK_OF_YEAR, week);
    cld.get(Calendar.DAY_OF_WEEK); // WARNING this line is required to make the code work. Might have something to do with an inner function called complete which gets called on get.
    cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    return cld.getTime();
}

private Date getEndDateObject() {
    Date endDateObject = getDateObject();
    long timeMilliseconds = endDateObject.getTime();
    long sixDaysMilliseconds = 60 * 60 * 24 * 6 * 1000;
    endDateObject.setTime(timeMilliseconds + sixDaysMilliseconds);
    return endDateObject;
}

特别注意这一行

    cld.get(Calendar.DAY_OF_WEEK);

如果有人可以解释为什么吸气剂影响日历的输出,那么奖励指向他们。但是对不起WTF ....我偶然发现这个问题的唯一原因是我在我的Log.i中得到了一个,然后代码正在所有设备上工作。然后,当我去清理并删除所有调试和注释代码时,它再次停止工作。所以我最终把它归结为吸气剂。如果我评论该行,那么回来的日期是错误的并且更糟糕.....每次调用日历都会返回相同的日期/时间,即使日志记录显示他们正在使用不同的年份和周数.....所以简而言之,如果可能的话,不要使用Java Date。

然而,这仍然无法解释为什么如果我使用旧代码,4.2.1上的Nexus 7会在结束周返回不同的日期。有人可能会假设我的4.2模拟器和Nexus 7 4.2.1之间存在差异,但似乎不太可能。

从未如此,使用6天的添加方法似乎是最安全的并且全面运作。

下次我将使用Joda Time,但我现在没有时间研究如何使用它。

感谢所有帮助过的人,这在两个方面仍然是一个奇怪的谜。

  • 为什么getter会更改Calendar函数的输出?我的猜测是它声称内部调用的完整方法。但即使文档中提到过,我也无法称之为完全自我。

  • 为什么nexus 7 4.2.1与其他所有设备/模拟器的周期不同,当日历功能输入的参数完全相同时。

怪异。