Java Joda时间-返回1年,根据一周中的特定日期进行调整
我想回到一年前的joda时间,但我不想从2010年2月15日回到2009年2月15日,而是,如果2010年2月15日是星期一,那么我想回到2009年最接近的星期一 目前我正在使用这个: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
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年前。闰年的调整是不同的。什么