我希望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年。
答案 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)
使用
返回转换为String
Integer.toString
的值
因此转换为字符串相当愚蠢,然后立即转换回来:
int dayNumber = iDate.dayOfWeek().get();
// or
int dayNumber = iDate.getDayOfWeek();
答案 2 :(得分:0)
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.minusYears( 1 )
.previousOrSame( DayOfWeek.MONDAY )
Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。