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

时间:2014-06-12 06:09:10

标签: java date calendar

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

我需要帮助,谢谢:)

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]

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

5 个答案:

答案 0 :(得分:20)

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的{​​{1}}方法显示日期值,该值根据当前的本地设置进行格式化,这将提供更多有用的信息。

<强>更新

您应该使用系统toString,而不是使用GregorianCalendar,而不是... {/ p>

Calendar

此外,月份被Calendar date1 = Calendar.getInstance(); date1.set(2014, 06, 12); 编入索引,这意味着Janurary实际上是0而不是0,因此在您的示例中,您已将月份指定为7月,而不是6月。

所以,改为使用......

1

哪个输出......

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());

从今天开始下一个星期一......或多或少;)

答案 1 :(得分:9)

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 ) ;

要获得以下星期一,请使用TemporalAdjuster课程中的TemporalAdjusters实施。

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

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

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

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 2 :(得分:2)

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

    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。 / p>

答案 3 :(得分:0)

只是一个建议 - 你可以像这样使用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;
    }

答案 4 :(得分:0)

或者只是做一些简单的数学运算。由于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);