Joda Time - 返回1年,根据特定的星期几进行调整

时间:2011-12-02 13:04:45

标签: java jodatime

我希望1年后回到joda时间,但我不想从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年。

3 个答案:

答案 0 :(得分:4)

我会使用Joda Time方法返回1年,然后有一个switch语句将其移动到适当的日期。无法判断你是否想要从你的问题转到星期一。正如@Klas指出的那样,做自己的计算将会错过像闰年这样重要的事情。

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()]);

答案 1 :(得分:0)

首先,#getAsString()

  

使用String

返回转换为Integer.toString的值

因此转换为字符串相当愚蠢,然后立即转换回来:

int dayNumber = iDate.dayOfWeek().get();
// or
int dayNumber = iDate.getDayOfWeek();

答案 2 :(得分:0)

TL;博士

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .minusYears( 1 )
         .previousOrSame( DayOfWeek.MONDAY )

java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

一年前

java.time类可以做数学。

LocalDate yearAgo = today.minusYears( 1 ) ;

星期几

确定今天的星期几。

DayOfWeek dow = today.getDayOfWeek() ;

要调整为不同的日期时间值,请使用TemporalAdjuster实施。一个适用于您的目的可以在TemporalAdjusters课程中找到。

LocalDate previousOrSameDay = yearAgo.with( TemporalAdjusters.previousOrSame( dow ) ;

或者接下来的某一天。

LocalDate nextOrSameDay = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;

您需要定义进入下一个或上一个的规则。

Set< DayOfWeek > previous = EnumSet.range( DayOfWeek.MONDAY , DayOfWeek.THURSDAY ) ;  // Collect Mon, Tue, Wed, and Thu.
Set< DayOfWeek > next = EnumSet.complementOf​( previous) ;  // Collect Fri, Sat, Sun.

然后测试你的星期几。

LocalDate ld ;
if( previous.contains( dow ) ) {
    ld = yearAgo.with( TemporalAdjusters.previousOrSame( dow ) ;
} else if ( next.contains( dow ) ) {
    ld = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;
} else {
    // Handle unexpected error.
    System.out.println( "Unexpectedly reached IF-ELSE for day-of-week: " + dow ) ;
}

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore