【问题标题】:Change the first week of a year更改一年的第一周
【发布时间】:2012-10-16 08:39:23
【问题描述】:

使用 Java 的日历或其他东西,假设我将日期设置为 2012-10-26。我希望这个日期是一年的第一天。假设一年的第一周从 2012 年 10 月 26 日开始,是否可以获得特定日期的周数 - 假设是 2012 年 12 月 10 日?

我知道我的问题听起来有点奇怪,但我可以使用任何有用的输入。

谢谢。

--详情

我有一个名为WeeklySchedule 的数据库表。在这张表中,我有从 Week1Week52 的列,每一列都有一些关于那一周的日子的数据。不幸的是,Week1 并不是一年中的第一周。我需要假设 Week12012-08-26 开始计算。

【问题讨论】:

  • 试过什么?至少看过Calendar>的文档
  • @Nambari 我添加了一些关于我的问题的细节。不幸的是,我现在没有任何工作代码,因为我不知道如何处理这个问题。
  • @RohitJain 是的,我尝试手动将日历日期设置为 2012-08-26,然后将 WEEK_OF_YEAR 设置为 1;但是当我更改 WEEK_OF_YEAR 时,日期会自动更改。没有运气。

标签: java date datetime calendar


【解决方案1】:

这是使用日历 API 的一种方法:

private static final Calendar START_CAL = createAugust26th2012Cal();

public int getWeekNumber(Calendar someCal) {
    int theWeek = someCal.get(Calendar.WEEK_OF_YEAR);
    int weekCount = 0;
    while (theWeek != START_CAL.get(Calendar.WEEK_OF_YEAR)) {
        someCal.add(Calendar.WEEK_OF_YEAR, -1);
        theWeek = someCal.get(Calendar.WEEK_OF_YEAR);
        weekCount++;
    }
    return weekCount;
}

或者您可以获取两个日历之间的差异(以毫秒为单位),然后将结果除以一周中的毫秒数:

如果您使用这种方法,请不要忘记考虑时区和夏令时。

我不记得确切代码是什么样子来补偿 DST,但我认为它是这样的: (我不太记得你是添加偏移量还是从两个操作数中减去偏移量)

private static final long ONE_WEEK_MILLIS = 1000 * 60 * 60 * 24 * 7;

public int getWeeksBetween(Calendar calOne, Calendar calTwo) {
    long millisOne = calOne.getTime().getTime();
    long millisTwo = calTwo.getTime().getTime();
    long offsetOne = calOne.getTimeZone().getOffset(millisOne);
    long offsetTwo = calTwo.getTimeZone().getOffset(millisTwo);
    long diff = (millisTwo - offsetTwo) - (millisOne + offsetOne );
    return diff / ONE_WEEK_MILLIS;
}

【讨论】:

  • 其实我已经在使用这种方法了,但我认为这不是最好的方法。应该有另一种动态的方式来做到这一点。
  • 我不知道为什么你会期望这种代码存在于库中。实现自己需要很少的工作。我建议的另一种方法是以毫秒为单位减去两个日期之间的时间,然后除以一周中的毫秒数(然后将结果四舍五入)。如果您这样做,请不要忘记考虑时区!
  • @jahroy 我刚刚意识到您提供的第一个代码片段:假设开始日期是“08-26-2012”并且 someCal 日期是“2013-03-16”, weekCount 为 28,DAY_OF_WEEK 为 7(星期六)。如果我们保持开始日期不变,并将 someCal 更改为“2013-03-17”,则 weekCount 将保持不变,但 DAY_OF_WEEK 将为 1(星期日)。在这种情况下,weekCount 应该是 29。这是某种日历错误,还是代码中的逻辑错误?
  • 我的代码未经测试...我希望日历代码没有错误!
  • @alicozgo - 现在我考虑了一下,该代码应该使用Calendar.add(Calendar.WEEK_OF_YEAR, -1) 而不是滚动。那应该解决它。 (我现在正在参加一场足球比赛)。
【解决方案2】:

我从来没有见过这样的内置函数,只有像Calendar.get(WEEK_OF_YEAR)JodaLocalDate.getWeekOfWeekyear() 这样的调用。与 Joda Time 这样的库相比,java.util.Calendar(和 Date)通常被认为是一个糟糕的库。 This SO post 有一个很好的优缺点列表。

请注意,如果您的数据库表适用于一年又一年地重复,您可能会遇到麻烦。有些年份 (71 years per 400, or about 1 every 5.6) 有 53 周。

鉴于上述情况,您可能需要接受一个近似值,例如计算 days between the two dates 的数量除以 7(所有 mod 52),这将每年滑落少量,或者计算 (weekOfYear(date) - weekOfYear(startDate)) % 52,这可能会在日历年初的一周左右重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多