Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Joda时间-返回1年,根据一周中的特定日期进行调整_Java_Jodatime - Fatal编程技术网

Java Joda时间-返回1年,根据一周中的特定日期进行调整

Java Joda时间-返回1年,根据一周中的特定日期进行调整,java,jodatime,Java,Jodatime,我想回到一年前的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).dayOfWe

我想回到一年前的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年前

使用
Integer.toString
返回转换为
字符串的值

因此,将其转换为字符串,然后立即转换回字符串是相当愚蠢的:

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

使用
Integer.toString
返回转换为
字符串的值

因此,将其转换为字符串,然后立即转换回字符串是相当愚蠢的:

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

我会使用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()]);

我会使用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()]);
tl;博士 java.time 该项目现在正在进行中,团队建议迁移到类

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

一年前 time类可以做数学运算

LocalDate yearAgo = today.minusYears( 1 ) ;
星期几 确定一周中的今天

DayOfWeek dow = today.getDayOfWeek() ;
LocalDate nextOrSameDay = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;
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 ) ;
}
要调整为不同的日期时间值,请使用实现。在课堂上可以找到一个适合你的

或者一周中的第二天

DayOfWeek dow = today.getDayOfWeek() ;
LocalDate nextOrSameDay = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;
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 ) ;
}
您需要定义转到下一个或上一个的规则

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.

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 java.time 该项目现在正在进行中,团队建议迁移到类

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

一年前 time类可以做数学运算

LocalDate yearAgo = today.minusYears( 1 ) ;
星期几 确定一周中的今天

DayOfWeek dow = today.getDayOfWeek() ;
LocalDate nextOrSameDay = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;
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 ) ;
}
要调整为不同的日期时间值,请使用实现。在课堂上可以找到一个适合你的

或者一周中的第二天

DayOfWeek dow = today.getDayOfWeek() ;
LocalDate nextOrSameDay = yearAgo.with( TemporalAdjusters.nextOrSame( dow ) ;
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 ) ;
}
您需要定义转到下一个或上一个的规则

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.

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

。。。你不想回到1年前。闰年的调整是不同的。你对“最近(一周中的某一天)”的定义是什么?考虑到2010-02-15作为输入,你希望2009-02-16作为输出。您预计2012-02-15输入的输出是什么?所以。。。你不想回到1年前。闰年的调整是不同的。什么