1

好吧,所以这个难倒我。我有以下代码尝试创建此字符串:

输出: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 时,会在以下设备上提供以下输出:

  • 连结 S - 4.1
  • 模拟器 4.1
  • 模拟器 4.2

输出:52. 2012(12 月 24 日至 12 月 30 日)

哪个是对的!

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

输出:52. 2012(12 月 24 日至 1 月 6 日)

哇!!!!!

所有设备都设置为澳大利亚东部标准时间 +10,并且现在具有正确的时间/日期。我认为这与 4.2 中缺少的 12 月没有任何关系,无论如何应该在 4.2.1 中修复。

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

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

4

1 回答 1

3

好的,首先感谢 Jon Skeet 建议增加 6 天来结束一周以避免各种问题。这绝对是要走的路。

因此,为了将来参考,请避免使用 Java 日历/日期。但是我偶然让我的代码在每个设备/平台上工作。

这是我修改后的代码:

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 中有一个 get ,然后代码可以在所有设备上运行。然后,当我去清理它并删除我所有的调试和注释代码时,它再次停止工作。所以我最终把它归结为吸气剂。如果我评论指出返回的日期是错误的,更糟糕​​的是.....每次调用日历都会返回相同的日期/时间,即使日志显示它们使用不同的年份和周......所以简而言之,如果可能,请不要使用 Java Date。

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

尽管如此,使用 6 天加法似乎是最安全的,并且可以全面发挥作用。

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

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

  • 为什么 getter 会改变 Calendar 函数的输出?我的猜测是它与它声称在内部调用的完整方法有关。但是,即使文档中提到了,我也不能称自己为完整。

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

奇怪的。

于 2013-01-21T06:00:33.403 回答