好的,所以这个让我很难过。 我有以下代码尝试创建此字符串:
产出: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在以下设备上给出以下输出:
产出: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周或者其他什么? 我不知道,我只是不明白为什么这个设备有任何不同。
答案 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与其他所有设备/模拟器的周期不同,当日历功能输入的参数完全相同时。
怪异。