gpt4 book ai didi

java - 公历 : Jumping from tuesday to sunday

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:22 30 4
gpt4 key购买 nike

我有一个 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 日历或任何其他日历。

编辑:我找到方法 setWeekDate(year, week_of_year, day_of_week)。人们会认为将年、周和星期几设置为相同的方法将授予它成功。它没有:仍然从第 2 位到第 14 位。这是什么猴子写的?

最佳答案

我对你的代码做了一些小改动:

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)。由于两台机器都使用相同的代码来初始化值并使用它们,所以应该不会有问题。但是,如果您在不同的机器上使用这些值作为毫秒(例如,通过网络服务或其他方式公开该值),您可能会遇到问题。

关于java - 公历 : Jumping from tuesday to sunday,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384222/

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