【问题标题】:Java Calendar.DAY_OF_WEEK gives wrong dayJava Calendar.DAY_OF_WEEK 给出错误的日期
【发布时间】:2018-10-13 04:37:38
【问题描述】:

下面的代码有什么问题?它给出了一年中任何日期的错误日期。

import java.util.Scanner;
import java.util.Calendar;
public class Solution {
    public static String getDay(String d, String m, String y) {

        String[] days = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
        Calendar c = Calendar.getInstance();
        c.set(Integer.parseInt(y), Integer.parseInt(m), Integer.parseInt(d)); 
        return days[c.get(Calendar.DAY_OF_WEEK) - 1]; 
    }
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String m = in.next();
        String d = in.next();
        String y = in.next();

        System.out.println(getDay(d, m, y));
    }
}

【问题讨论】:

  • 2018 年 3 月 5 日提供,星期四回来了,这是正确的。你能提供失败场景的例子吗?
  • 我尝试了 2015 年 8 月 5 日(2015 年 8 月 5 日),结果是星期六而不是星期三。
  • @clement 代码中的顺序是年月日。 2018 年 3 月 5 日是星期一,所以当你得到星期四时,它是不正确的。
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle
  • @OleV.V.该死的美国日期格式,我们在澳大利亚使用 dd/mm/yyyy(在法国也是如此;)),2018 年 5 月 3 日确实是星期四 :)

标签: java date dayofweek java.util.calendar


【解决方案1】:

请参阅Calendar 类的文档:https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#set-int-int-int-

月份的值以 0 为索引,因此如果您提供 3 作为月份值,它将被解释为“四月”。

【讨论】:

  • 非常感谢。我通过从输入值中减去一个来更正 MONTH,它起作用了。
【解决方案2】:

Scanner 读取int 值而不是字符串是最简单的:

    int m = in.nextInt();
    int d = in.nextInt();
    int y = in.nextInt();

    System.out.println(LocalDate.of(y, m, d).getDayOfWeek());

当我喂5 4 2018(今天的日期)时,我得到FRIDAY,这是正确的。

如果必须使用字符串:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");

    String m = in.next();
    String d = in.next();
    String y = in.next();

    System.out.println(LocalDate.parse(m + '/' + d + '/' + y, dateFormatter).getDayOfWeek());

您使用的Calendar 类早已过时,设计不佳,有时使用起来很麻烦。相反,我推荐java.time,现代Java 日期和时间API。它好多了。就一件小事而言,它以与人类相同的方式对一年中的月份进行编号。

此外,星期几的名称是内置的,所以不要重新发明轮子。您的字符串与java.timeDayOfWeek 枚举值的名称一致,因此只需打印这些值即可获得所需的字符串。如果您不希望全部大写或希望使用另一种语言的日期名称,请使用 DayOfWeek.getDisplayNameDateTimeFormatter

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2017-03-25
    • 2020-01-22
    • 2011-07-15
    • 2013-07-25
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多