特定日期后的下周一首先获得?

Rid*_*ris 9 java calendar date

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

我需要帮助,谢谢:)

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);
Run Code Online (Sandbox Code Playgroud)

这是输出:

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]
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*mer 23

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);
Run Code Online (Sandbox Code Playgroud)

哪个打印......

2014-06-12
2014-06-16
Run Code Online (Sandbox Code Playgroud)

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

ld = ld.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
Run Code Online (Sandbox Code Playgroud)

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's to toString方法显示基于当前本地设置格式化的日期值,这将提供更多有用的信息.

更新

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

Calendar date1 = Calendar.getInstance();
date1.set(2014, 06, 12);
Run Code Online (Sandbox Code Playgroud)

此外,月份被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());
Run Code Online (Sandbox Code Playgroud)

哪个输出......

Mon Jun 16 16:22:26 EST 2014
Run Code Online (Sandbox Code Playgroud)

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


Bas*_*que 9

TL;博士

LocalDate.of( 2014 , Month.JUNE , 12 )
         .with( TemporalAdjusters.next( DayOfWeek.MONDAY ) )
Run Code Online (Sandbox Code Playgroud)

使用java.time

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

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值.

LocalDate ld = LocalDate.of( 2014 , Month.JUNE , 12 ) ;
Run Code Online (Sandbox Code Playgroud)

要获得下一个星期一,请使用课程中的TemporalAdjuster实现TemporalAdjusters.

LocalDate nextMonday = ld.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ;
Run Code Online (Sandbox Code Playgroud)

如果您想要使用原始日期(如果它本身是星期一),那么请使用nextOrSame调整器.

LocalDate nextOrSameMonday = ld.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.