Java Calendar.DAY\u OF\u WEEK给出了错误的日期

Java Calendar.DAY\u OF\u WEEK给出了错误的日期,java,date,dayofweek,java.util.calendar,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", "THURS

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

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

请参阅
日历类的文档:


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

最容易让
扫描仪读取
int
值,而不是字符串:

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

    System.out.println(LocalDate.of(y, m, d).getDayOfWeek());
当我输入2018年4月5日(今天的日期)时,我得到的是星期五,这是正确的

如果必须使用字符串:

    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.time
DayOfWeek
enum的值的名称一致,因此只需打印这些值即可获得所需的字符串。如果您不希望使用所有大写字母或希望使用另一种语言的日期名称,请使用
DayOfWeek.getDisplayName
DateTimeFormatter


链接:解释如何使用
java.time

提供了2018年3月5日的信息,并于周四返回,这是正确的。您能提供失败场景的示例吗?我尝试了2015年8月5日(2015年8月5日),结果是星期六而不是星期三。@clement代码中的顺序是年月日。2018年3月5日是星期一,所以当你得到星期四时,它是不正确的。仅供参考,像、
java.text.SimpleDateFormat
这样麻烦的旧日期时间类现在被java 8和更高版本中内置的类所取代。请参阅。该死的美国日期格式,我们在澳大利亚使用的是dd/mm/yyyy(在法国也是如此),2018年5月3日确实是一个星期四:)非常感谢。我通过从输入值中减去一个来修正这个月,它成功了。