Java Calendar.DAY_OF_WEEK给出了错误的一天

时间:2018-05-03 00:26:12

标签: java date dayofweek java.util.calendar

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

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));
    }
}

2 个答案:

答案 0 :(得分:3)

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

月份的值为0索引,因此如果您提供3作为月份值,则会将其解释为" April"。

答案 1 :(得分:3)

最简单的是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。它好多了。对于一件小事,它以与人类相同的方式记录一年中的几个月。

此外,星期几的名字都是内置的,所以不要重新发明轮子。您的字符串与DayOfWeekjava.time枚举的值的名称一致,因此只需打印它们即可获得所需的字符串。如果您不希望全部使用大写字母,或者希望使用其他语言设置日期名称,请使用DayOfWeek.getDisplayNameDateTimeFormatter

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