我正在尝试获取实际月份1之前的星期一的日期

时间:2019-01-29 16:33:59

标签: java dayofweek java.util.calendar

当我使用Calendary库时,Java不会执行代码的某些行。

我正在尝试获取实际月份1之前的星期一。

//Today is Tuesday, 2 January of 2019 (29/01/2019)

Calendar cp1 = GregorianCalendar.getInstance();
cp1.set(Calendar.DAY_OF_MONTH, 1); //THIS LINE DON'T WORKS
cp1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat sdf=new SimpleDateFormat ("dd/MM/yyyy");
System.out.println(sdf.format (cp1.getTime()));

//返回28/01/2019而不是31/12/2018。

如果我在第2行之后添加了System.out.println(cp1),那么Java不会跳过第2行并且运行良好。

//Today is Tuesday, 2 January of 2019 (29/01/2019)

Calendar cp1 = GregorianCalendar.getInstance();
cp1.set(Calendar.DAY_OF_MONTH, 1); //THIS LINE WORKS NOW
System.out.println (cp1.getTime());
cp1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat sdf=new SimpleDateFormat ("dd/MM/yyyy");
System.out.println(sdf.format (cp1.getTime())); 

//返回正确的日期2018年12月31日。

///为什么Java在我的第一个代码中没有执行第二行?是Java错误吗?

预期结果“ 31/12/2018”。 实际结果为“ 28/01/2019”。

1 个答案:

答案 0 :(得分:2)

我强烈建议使用java.time,因为它更易于处理。

使用TemporalAdjuster类中的TemporalAdjusters实现。将DayOfWeek枚举对象传递给您所需的星期几。

LocalDate now = LocalDate.now();
LocalDate mondayBefore1OfMonth = now.withDayOfMonth(1)
                                    .with(TemporalAdjusters.previous(DayOfWeek.MONDAY));

System.out.println(mondayBefore1OfMonth); // 2018-12-31

针对您的问题(可复制为https://ideone.com/ph73wK  ),如果您不调用私有方法computeTime(),则通过调用Calendar.DAY_OF_MONTH或{{1 }},它将更新日期,您将获得良好的结果