特定日期后第一个下周一获得?

我知道这里有同样的问题,但我已经尝试了提供的答案,它返回了一个我不明白的输出。 我对答案感到困惑,我不认为输出是正确的。

我需要帮助,谢谢:)

GregorianCalendar date1 = new GregorianCalendar( 2014, 05, 12 ); //05 is june as month start from 0 -11 while( date1.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY ) date1.add( Calendar.DATE, 1 ); System.out.println(date1); 

这是输出:

 java.util.GregorianCalendar[time=1405267200000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=195,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0] 

在输出的哪个位置我应该提取以检索星期一的日期?

Java 8+

 LocalDate ld = LocalDate.of(2014, Month.JUNE, 12); System.out.println(ld); ld = ld.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); System.out.println(ld); 

哪个打印……

 2014-06-12 2014-06-16 

因为我的实际日期可能是星期一,你也可以使用……

 ld = ld.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY)); 

Java <= 7

您应该使用ThreeTen Backport ,它为您提供Java 8 Date / Time API的支持

原始答案

而不是System.out.println(date1); 使用System.out.println(date1.getTime());

getTime返回Date一个实例,它表示Calendar的当前状态

哪个将于Mon Jul 14 00:00:00 EST 2014输出

System.out.println(date1)是使用System.out.println(date1.toString()) ,在这种情况下,它会转储一堆关于Calendar对象状态的有用信息,但不是真的人类可读数据。

System.out.println(date1.getTime())将使用Date to toString方法显示日期值,该值基于当前本地设置进行格式化,这将提供更多有用的信息。

更新

而不是使用GregorianCalendar ,您应该使用系统Calendar ,例如……

 Calendar date1 = Calendar.getInstance(); date1.set(2014, 06, 12); 

此外,月份为0索引,这意味着Janurary实际上是0而不是1 ,所以在您的示例中,您已将月份指定为7月而不是6月。

所以,相反,使用……

 Calendar date1 = Calendar.getInstance(); date1.set(2014, 05, 12); while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { date1.add(Calendar.DATE, 1); } System.out.println(date1.getTime()); 

哪个输出……

 Mon Jun 16 16:22:26 EST 2014 

这是从今天下周一…或多或少;)

TL;博士

 LocalDate.of( 2014 , Month.JUNE , 12 ) .with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) 

使用java.time

您正在使用现在遗留的麻烦的旧日期时间类,取而代之的是java.time类。

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

 LocalDate ld = LocalDate.of( 2014 , Month.JUNE , 12 ) ; 

要获得以下星期一,请使用TemporalAdjusters类中的TemporalAdjuster实现。

 LocalDate nextMonday = ld.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ; 

如果你想使用原始日期,如果它本身是星期一,那么使用nextOrSame调整器。

 LocalDate nextOrSameMonday = ld.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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

对您的代码进行细微更改:

  GregorianCalendar date1 = new GregorianCalendar(2014, 6, 12); while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { date1.add(Calendar.DATE, 1); } SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); System.out.println(sdf.format(date1.getTime())); 

产量:

  14-07-2014 

编辑:根据JavaDoc文档,您使用的构造函数需要基于0的月份索引,因此对于6月份,您需要传入值5而不是6。

只是一个建议 – 你可以使用switch语句和Calendar.add(),而不是循环,如下所示:

 int weekdayNum = c.get(Calendar.DAY_OF_WEEK); switch (weekdayNum) { case 1: { c.add(Calendar.DAY_OF_MONTH, 1); break; } case 3: { c.add(Calendar.DAY_OF_MONTH, 6); break; } case 4: { c.add(Calendar.DAY_OF_MONTH, 5); break; } case 5: { c.add(Calendar.DAY_OF_MONTH, 4); break; } case 6: { c.add(Calendar.DAY_OF_MONTH, 3); break; } case 7: { c.add(Calendar.DAY_OF_MONTH, 2); break; } default: break; } 

或者只做一些简单的数学运算。 由于Calender.Monday等于2,因此很容易计算需要添加到当前日期的天数。

 Calendar date1 = Calendar.getInstance(); date1.set(2014, 05, 12); int dayOfWeek = date1.get(Calendar.DAY_OF_WEEK); date1.add(Calendar.DATE, (9 - dayOfWeek) % 7);