gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:51:06 26 4
gpt4 key购买 nike

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

OUTPUT: 52. 2012 (24 Dec to 30 Dec)

这是 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;
}

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

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

OUTPUT: 52. 2012 (24 Dec to 30 Dec)

哪个是正确的!

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

OUTPUT: 52. 2012 (24 Dec to 6 Jan)

WTF!!?!?

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

当我调试它时,日历显示它具有所有正确的值。然后是 1 月 6 日?

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

最佳答案

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

因此为了将来的引用,避免 Java Calendar/Date 被它 foobared。但是我的代码意外地在每个设备/平台上运行。

这是我修改后的代码:

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);

如果有人能解释为什么 getter 会影响日历的输出,那么就会给他们加分。但我很抱歉 WTF ....我偶然发现这个的唯一原因是我在我的 Log.i 中有一个 get 然后代码在所有设备上工作。然后当我去清理它并删除我所有的调试和注释代码时它再次停止工作。所以我最终把它归结为 setter/getter 。如果我评论说返回的日期是错误的,更糟糕​​的是……每次调用日历都会返回相同的日期/时间,即使日志记录显示他们使用的是不同的年份和星期……所以简而言之,如建议的那样,尽可能不要使用 Java Date。

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

无论如何,使用 6 天添加方法似乎是最安全的,并且适用于所有情况。

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

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

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

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

奇怪。

关于java - Nexus 7 4.2 上的 Android Java 日历日期 WEEK_OF_YEAR 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com