查找给定日期的星期几

Finding the day of week of a given date

我在 hackerrank.com 中做了一个简单的例子,它要求我们 return 给定日期的那一天。例如:如果日期是 08 05 2015(月日年),它应该 return 星期三。

这是我为此任务编写的代码

public static String getDay(String day, String month, String year) {
    String[] dates=new String[]{"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};
    Calendar cal=Calendar.getInstance();
    cal.set(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
    int date_of_week=cal.get(Calendar.DAY_OF_WEEK);
    return dates[date_of_week-1];
}

我的代码 returns 'Saturday' 对于给定的例子应该是 'Wednesday'。对于当前日期 10 29 2017,它 returns 'Wednesday'。 谁能帮我解决这个问题?

假设您使用的是 Java 8+,您可以使用 LocalDate

之类的东西
public static String getDay(String day, String month, String year) {
    return LocalDate.of(
            Integer.parseInt(year),
            Integer.parseInt(month),
            Integer.parseInt(day)
    ).getDayOfWeek().toString();
}

此外,请注意,您将方法描述为采用 monthdayyear,但您实施它采用 daymonthyear(确保你正确调用它)。我用

测试了上面的内容
public static void main(String[] args) throws Exception {
    System.out.println(getDay("05", "08", "2015"));
    System.out.println(getDay("29", "10", "2017"));
}

然后我得到(如预期的那样)

WEDNESDAY
SUNDAY

如果您不能使用 Java 8(或只是为了修正您当前的解决方案),Calendar takes a month offset from 1 (Calendar#JANUARY 就是 0)。所以你需要(并且更喜欢 parseInt 而不是 valueOf,第一个 returns 一个原始的 - 第二个 Integer 实例)像

public static String getDay(String day, String month, String year) {
    String[] dates = new String[] { "SUNDAY", "MONDAY", "TUESDAY", //
            "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY" };
    Calendar cal = Calendar.getInstance();
    cal.set(Integer.parseInt(year), //
            Integer.parseInt(month) - 1, // <-- add -1
            Integer.parseInt(day));
    int date_of_week = cal.get(Calendar.DAY_OF_WEEK);
    return dates[date_of_week - 1];
}

结果与上面相同。

Calendar 中的月份在 cal.set(int,int,int) 中为零。如果我用 getDay("29", "9", "2017") 调用你的方法,它 returns 星期天。因此,用少一个月(即 9)调用您的方法,或者使用月份的日历常量(Calendar.OCTOBER)调用它,或者在对 cal.set.[=17= 的调用中执行 month+1 ]

查看此 运行 演示:https://ideone.com/A6WGRJ。我还添加了打印日期以确认它打印了正确的日期。