GregorianCalendar:从周二跳到星期日

时间:2014-12-09 16:44:22

标签: java calendar gregorian-calendar

我在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。猴子写了什么?

2 个答案:

答案 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. 检查this.THIS_WEEK的值。我已将其替换为值1,它在我的机器上正常工作。
  2. 检查两台机器上的时区(在我的情况下是GMT + 2)。由于两台机器都使用相同的代码来初始化值并使用它们,因此应该没有问题。但是如果你在不同的机器上使用这些值作为毫秒(例如通过web服务或某些东西暴露值),你可能会遇到问题。

答案 1 :(得分:0)

我会尝试使用java.util.Calendar方法add(int field,int amount)。

nextSunday.add(Calendar.DAY_OF_MONTH,5)。一行代码而不是三行。