除七月外,全年日历工作

Calendar work in all the year except in July

我有一个使用日历的应用程序,我需要获取星期几。问题是它在一年中的所有日期中都采用正确的星期几,除了 7 月。

我尝试在全年添加不同的日期,但这个问题只发生在 7 月。

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(fechaaux);
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

如果 fechaux 在八月的星期一这个 returns 6(这没关系),但是如果我在七月的星期一添加日期这个 returns 7,那么它应该显示 6。为什么会这样?

谢谢!

DAY_OF_WEEK不是星期几,是从1到7的数字如果是星期天,就会return1等等。

这样的话,如果是周一就会return2,

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
Date date = formatter.parse("01/07/2019"); 
Calendar c = Calendar.getInstance(); 
c.setTime(date); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
System.out.println(dayOfWeek);

Out Put:2

如果可以使用实际的星期几 - 如果可能,请考虑使用 LocalDate(Java 8+):

LocalDate ld = LocalDate.of(2019, 6, 27);
System.out.println(ld.getDayOfWeek());

输出:

THURSDAY

java.time

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/u");
    String fechaaux = "01/07/2019";
    LocalDate date = LocalDate.parse(fechaaux, formatter);
    DayOfWeek dayOfWeek = date.getDayOfWeek();

    System.out.println("dayOfWeek: " + dayOfWeek);

输出为:

dayOfWeek: MONDAY

您应该避免使用 SimpleDateFormatDateCalendar。虽然我不知道您的代码出了什么问题,但那些 类 早已过时且设计不佳。相反,我推荐 java.time,现代 Java 日期和时间 API。与它一起工作要好得多。

But can I add the "date" object, to this?

有时我们从 API 中得到一个 old-fashioned Date 对象,我们现在不想升级。在这种情况下,可能的转换是:

    ZonedDateTime zdt
            = oldfashionedDate.toInstant().atZone(ZoneId.systemDefault());
    DayOfWeek dayOfWeek = zdt.getDayOfWeek();

编辑:

Is much better use Java Date before than Java Calendar? The result is the same?

你应该避免两者。仅当您从无法更改的遗留 API 中获得其中之一时,才接受您获得的内容并将其转换为现代类型。如果得到 Date,请使用上面的转换。如果你得到 Calendar,你可以确定它是 GregorianCalendar。如果是:

    ZonedDateTime zdt = ((GregorianCalendar) theCalendarYouGot).toZonedDateTime();

现在按上述方法进行。

从历史上看,CalendarGregorianCalendar 是作为(有点失败的)尝试弥补 Date 的设计问题而引入的。

Link: Oracle tutorial: Date Time 解释如何使用 java.time.