6

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

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

谢谢。

- 细节

我有一个名为WeeklySchedule的数据库表。在这个表中,我有从Week1Week52的列,每一列都有一些关于该周天数的数据。不幸的是,第 1实际上并不是一年中的第一周。假设Week12012-08-26开始,我需要进行计算。

4

2 回答 2

2

这是使用日历 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;
}

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

如果您使用这种方法,请不要忘记考虑 TimeZones 和 Daylight Saving Time。

我不记得确切的代码是什么样子来补偿 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;
}
于 2012-10-26T06:19:43.747 回答
1

我从未见过为此的内置函数,只调用 likeCalendar.get(WEEK_OF_YEAR)JodaLocalDate.getWeekOfWeekyear(). java.util.Calendar(and Date) 通常被认为是一个糟糕的图书馆,与 Joda Time 这样的图书馆相比。这篇 SO 帖子有一个很好的优缺点列表。

请注意,如果您的数据库表适用于一年中的年复一年重复,您可能会遇到麻烦。有些年份(每 400 年 71 年,或每 5.6 年大约 1 年)有 53 周。

鉴于上述情况,您可能希望获得一个近似值,例如计算两个日期之间的天数除以 7(所有 mod 52),这将每年滑动少量,或者计算(weekOfYear(date) - weekOfYear(startDate)) % 52,这可能会重复日历年年初的一周。

于 2012-10-26T06:10:14.390 回答