在特定日期后获得下周一的第一个?Java 8+Java <= 7原始答案tl;博士使用 java.time关于 java.time

2022-09-02 02:27:40

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

我需要帮助,谢谢:)

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]

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


答案 1

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返回一个实例,该实例表示DateCalendar

这将输出Mon Jul 14 00:00:00 EST 2014

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

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

更新

而不是使用,你应该使用系统,例如...GregorianCalendarCalendar

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

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

因此,相反,使用...

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

这是从今天开始的下周一...或多或少;)


答案 2

tl;博士

LocalDate.of( 2014 , Month.JUNE , 12 )                    // Represent a date-only value, without time-of-day and without time zone.
         .with(                                           // Move from one date to another by passing an implementation of the `TemporalAdjuster` interface. 
             TemporalAdjusters.next( DayOfWeek.MONDAY )   // Use an existing implementation found on utility class `TemporalAdjusters` (plural versus singular).
         )                                                // Returns another fresh `LocalDate` object rather than altering the original, per immutable objects design.

使用 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 类?

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