【问题标题】:Calendar work in all the year except in July除 7 月外,全年日历工作
【发布时间】:2019-11-09 07:42:25
【问题描述】:

我有一个使用日历的应用程序,我需要查看星期几。问题在于,除 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 在 8 月的星期一,则返回 6(这没关系),但如果我在 7 月的星期一添加日期,则返回 7,它应该显示 6。为什么会这样?

谢谢!

【问题讨论】:

  • 您能提供示例输入吗?顺便说一句,星期一应该是 2。
  • 除了@GyroGearless 评论,你有没有将一周的第一天设置为其他任何一天?例如:cal.setFirstDayOfWeek(Calendar.MONDAY);
  • @GyroGearless 确定!在正常月份,它显示周二像 7,周三像 1。而在 7 月,它显示周一像 7,周二像 1。
  • 我建议您不要使用SimpleDateFormatDateCalendar。这些类设计不佳且过时已久,尤其是第一个类是出了名的麻烦。而是使用LocalDateDateTimeFormatterDayOfWeek,均来自java.time, the modern Java date and time API
  • 与 Ole V.V. 相同。说,但更强大:您必须立即放弃 CalendarDateSimpleDateFormat 类,并开始使用 java.time 包中提供的更新的 Java 日期和时间 API。

标签: java dayofweek java.util.calendar


【解决方案1】:

DAY_OF_WEEK 不是星期几,是从 1 到 7 的数字,如果是星期日,则返回 1,以此类推。

在这种情况下,如果是星期一,则返回 2,

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

【讨论】:

  • 嗨!感谢您的回答:) 应该是 2?我究竟做错了什么?我在 jsp 页面上有这段代码,并且总是显示星期二像 7 和星期三像 1。
  • 会不会是日期格式的问题?在我的情况下,如果小于 10,我会在日期和月份之前删除“0”。像这样“01/07/2019/ 到“1/7/2019”
  • @Abraham,是的,如果是星期一,那么应该是 2 [1-7]=[Sunday - Saturday] 也许,您可能已将“setFirstDayOfWeek”设置为其他日期。
  • 这些可怕的类在几年前被 JSR 310 定义的现代 java.time 类所取代。建议在 2019 年使用它们是糟糕的建议。
【解决方案2】:

如果您可以使用一周中的实际日期 - 如果可能,请考虑使用 LocalDate (Java 8+):

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

输出:

星期四

【讨论】:

  • 嗨!但是我可以添加“日期”对象吗?或者我应该创建一个划分年、月和日的函数来使用 LocalDate ld = LocalDate.of(year, mont, day);?
  • @Abraham 永远不要使用 java.util.Datejava.sql.Date 类。它们存在严重缺陷,由不了解日期时间处理复杂性的人设计。
【解决方案3】:

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:星期一

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

但是我可以在其中添加“日期”对象吗?

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

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

编辑:

使用 Java Date 比使用 Java Calendar 好得多吗?结果是 一样吗?

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

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

现在按上述方式进行。

过去,CalendarGregorianCalendar 被引入是为了弥补 Date 的设计问题(有些失败)。

链接: Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多