我想回溯约达时间的1年,但我不想从2010年2月15日到2009年2月15日,但是,例如,如果2010年2月15日是星期一,那么我想到达最近的星期一2009年。

目前,我正在使用此:

int dayNumber = Integer.parseInt(iDate.dayOfWeek().getAsString());

if(dayNumber == 1) { // start of week
    println(iDate.plusYears(-1).plusDays(1).dayOfWeek().getAsString());
}


暂时可以正常运行,但是可能有更安全的方法,例如,可以轻松返回5年。

最佳答案

我将使用Joda Time方法追溯到1年,然后有一个switch语句将其移至适当的日期。从您的问题中无法得知您是否想去星期一。如@Klas指出的那样,自己进行计算将错过重要的事情,例如leap年。

iDate = iDate.minusYears(1);
switch (iDate.getDayOfWeek()) {
    case 1:
        // monday so no change
        break;
    case 2:
        iDate = iDate.minusDays(1);
        break;
    case 3:
        iDate = iDate.minusDays(2);
        break;
    ...
}


如果您想花哨的话,可以构建一个小网格来加快速度。

// days in joda time are 1 based so 0 won't be used here
private static final int[] daysShift = new int[] = {0, 0, -1, -2, -3, 3, 2, 1};
...
iDate = iDate.minusYears(1);
// based on the current day, shift us by a certain number of days, + or -
iDate.plusDays(daysShift[iDate.getDayOfWeek()]);

07-27 13:43