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

2022-01-11 00:00:00 date calendar java

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

I know there is the same question here, but I have tried the answer provided and it returned an output that I don't understand. I am confused by the answer and I don't think the output is correct.

我需要帮助,谢谢:)

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]

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

Where on the output should I extract to retrieve Monday's date?

推荐答案

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

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

Because it's possible that the date my actually be a Monday, you could also use...

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

Java <= 7

您应该使用 ThreeTen Backport,它为您提供 Java 8 Date/的支持时间接口

Java <= 7

You should be using the ThreeTen Backport, which gives you the support of the Java 8 Date/Time API

代替 System.out.println(date1); 使用 System.out.println(date1.getTime());

getTime 返回一个 Date 的实例,它表示 Calendar

getTime returns an instance of Date which represents the current state of the Calendar

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

System.out.println(date1) 等价于使用 System.out.println(date1.toString()),在本例中为转储一堆关于 Calendar 对象状态的有用信息,但不是真正的人类可读数据.

System.out.println(date1) is the equivlent of using System.out.println(date1.toString()), which, in this case, is dumping a bunch of useful info about the state of the Calendar object, but not really human readable data.

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

System.out.println(date1.getTime()) will use the Date's to toString method to display a date value, formatted based on the current local settings, which will provide more useful information.

更新

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

Instead of using GregorianCalendar, you should use the system Calendar, for example...

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

此外,月份是 0 索引的,这意味着 Janurary 实际上是 0 而不是 1,因此在您的示例中,您指定了月份为 7 月,而不是 6 月.

Also, months are 0 indexed, meaning that Janurary is actually 0 not 1, so in your example, you've specified the month as July, not June.

所以,相反,使用...

So, instead, using...

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

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

Which is next Monday from today...more or less ;)

相关文章