我在9月2日星期二有一个GregorianCalendar实例。 valñue以毫秒为单位进行检查,确定无误。我想要另一个日历,即下周日(7日)23:59:59。所以:
GregorianCalendar currentCalendar = MyClock.INSTANCE.getCurrentCalendar();
GregorianCalendar nextSunday =
(GregorianCalendar)currentCalendar.clone();
// GregorianCalendar uses Sunday as first day of week, so we must
// advance one week
int currentWeek = nextSunday.get(GregorianCalendar.WEEK_OF_YEAR);
nextSunday.set(GregorianCalendar.WEEK_OF_YEAR,
currentWeek + this.THIS_WEEK);
nextSunday.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.SUNDAY);
nextSunday.set(GregorianCalendar.HOUR_OF_DAY, 23);
nextSunday.set(GregorianCalendar.MINUTE, 59);
nextSunday.set(GregorianCalendar.SECOND, 59);
nextSunday.set(GregorianCalendar.MILLISECOND, 0);
所以,因为星期日是GregorianCalendar每周的第1天,而我是第36周的一周,我加上一周,然后把这一天设定为星期日。
现在出现了真正的问题:当我使用OpenJDK 1.7.0_55在我的开发机器中执行时,它运行得很好。如果我使用OpenJDK 1.7.0_51进入我的测试机器,那就错了:
增加一周直到星期二9日,然后到星期日14日而不是星期日7日。
我不知道我做的是对还是错:真正让我失望的是结果取决于机器,而且我在GregorianCalendar上找不到那些OpenJDK版本的任何差异。对此行为的任何解释?
PD:请坚持使用GregorianCalendar。我知道有点蹩脚,但我不想在现有的发展阶段使用Joda Calendar或其他任何其他日历。编辑:我找到了方法setWeekDate(year,week_of_year,day_of_week)。人们会认为将年,周和星期设置为相同的方法将使其成功。它不会:仍然从第2到第14。猴子写了什么?
答案 0 :(得分:2)
我对您的代码做了一些改动:
SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy - HH:mm:ss.SSSS Z");
GregorianCalendar currentCalendar = (GregorianCalendar) Calendar.getInstance();
currentCalendar.set(Calendar.DAY_OF_MONTH, 2);
System.out.println(sdf.format(currentCalendar.getTime()));
GregorianCalendar nextSunday = (GregorianCalendar) currentCalendar.clone();
// GregorianCalendar uses Sunday as first day of week, so we must
// advance one week
int currentWeek = nextSunday.get(GregorianCalendar.WEEK_OF_YEAR);
nextSunday.set(GregorianCalendar.WEEK_OF_YEAR, currentWeek + 1);
nextSunday.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.SUNDAY);
nextSunday.set(GregorianCalendar.HOUR_OF_DAY, 23);
nextSunday.set(GregorianCalendar.MINUTE, 59);
nextSunday.set(GregorianCalendar.SECOND, 59);
nextSunday.set(GregorianCalendar.MILLISECOND, 0);
System.out.println(sdf.format(nextSunday.getTime()));
输出:
02 12 2014 - 19:40:46.0250 +0200
07 12 2014 - 23:59:59.0000 +0200
哪个是对的。但是,我有两点要指出:
答案 1 :(得分:0)
我会尝试使用java.util.Calendar方法add(int field,int amount)。
nextSunday.add(Calendar.DAY_OF_MONTH,5)。一行代码而不是三行。