Java 查找给定日期的星期几

Java 查找给定日期的星期几,java,datetime,calendar,datetime-format,dayofweek,Java,Datetime,Calendar,Datetime Format,Dayofweek,我在hackerrank.com上做了一个简单的例子,要求我们返回给定日期的日期。例如:如果日期是2015年5月8日(年月日),则应在星期三返回 这是我为此任务编写的代码 public static String getDay(String day, String month, String year) { String[] dates=new String[]{"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SA

我在hackerrank.com上做了一个简单的例子,要求我们返回给定日期的日期。例如:如果日期是2015年5月8日(年月日),则应在星期三返回

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

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];
}
对于给定的示例,我的代码返回“星期六”,它应该是“星期三”。对于当前日期2017年10月29日,返回“星期三”。
有人能帮我解决这个问题吗?

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

public static String getDay(String day, String month, String year) {
    return LocalDate.of(
            Integer.parseInt(year),
            Integer.parseInt(month),
            Integer.parseInt(day)
    ).getDayOfWeek().toString();
}
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];
}
另外,请注意,您将该方法描述为以
为单位,但您实现了以
为单位的方法(请确保正确调用该方法)。我测试了上面的测试

public static void main(String[] args) throws Exception {
    System.out.println(getDay("05", "08", "2015"));
    System.out.println(getDay("29", "10", "2017"));
}
我得到了(如预期的那样)

如果您不能使用Java 8(或只是为了修复当前的解决方案),则需要从
1
(is
0
)减去
month
)。因此,您需要(并且更喜欢
parseInt
而不是
valueOf
),第一个返回一个原语,第二个返回一个
Integer
实例)如下

public static String getDay(String day, String month, String year) {
    return LocalDate.of(
            Integer.parseInt(year),
            Integer.parseInt(month),
            Integer.parseInt(day)
    ).getDayOfWeek().toString();
}
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];
}
公共静态字符串getDay(字符串日、字符串月、字符串年){
字符串[]日期=新字符串[]{“星期日”、“星期一”、“星期二”//
“星期三”、“星期四”、“星期五”、“星期六”};
Calendar cal=Calendar.getInstance();
校准集(整数.parseInt(年)//

Integer.parseInt(month)-1,//日历中的month
是以零为基的。如果我用
getDay(“29”、“9”、“2017”)
调用你的方法,它将返回星期天。因此,用一个月(即9)调用你的方法,或者用该月的日历常量(
Calendar.十月
)调用它,或在调用
cal.set
时执行
month+1


查看此正在运行的演示:。我还添加了日期打印,以确认它打印的日期正确。

@elliotfrisch我相信您正在考虑
java.util.date
。是的,我在月份中添加了-1。现在它工作正常。谢谢。最后一部分不正确。请查看该->打印的年份。从1900开始的偏移量部分用于
java.util.Date(整数年、整数月、整数日期)
@Vasan Wow.Fixed.Thank.@ElliottFrisch它成功了。我在'month'参数中添加了-1。非常感谢。
DayOfWeek::getDisplayName
将自动本地化该
DayOfWeek
对象的名称。你真的必须使用
日历而不是更现代的
java.time
API吗?
LocalDayDate
要比这好得多。(另外,接受日/月/年而不是年/月/日顺序中的参数感觉很奇怪;为什么接受它们作为字符串而不是整数?如果调用代码只有字符串,它可以自己执行解析。)@JonSkeet是的,我试过LocalDate。这比使用日历更好。