我在hackerrank.com做了一个简单的例子,它要求我们返回给定日期的日期。例如:如果日期是2015年5月5日(月份日),则应该返回星期三。
这是我为此任务编写的代码
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日的当前日期,它将返回星期三'。 有人可以帮我解决这个问题吗?
答案 0 :(得分:8)
假设您使用的是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();
}
另请注意,您将该方法描述为采用month
,day
和year
,但您是通过day
,month
和{{1}来实施的(确保你正确地调用它)。我用
year
我得到(正如预期的那样)
public static void main(String[] args) throws Exception {
System.out.println(getDay("05", "08", "2015"));
System.out.println(getDay("29", "10", "2017"));
}
如果您无法使用Java 8(或仅修复当前解决方案),则Calendar
与WEDNESDAY
SUNDAY
的{{1}}偏移量为month
Calendar#JANUARY
为{ {1}})。所以你需要(并且更喜欢1
到0
,第一个返回一个原语 - 第二个返回parseInt
实例),比如
valueOf
给出与上面相同的结果。
答案 1 :(得分:2)
基于cal.set(int,int,int)的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];
}
调用您的方法,则会返回星期日。因此,请使用少一个月即9来调用您的方法,或者使用当月的日历常量(Calendar
)调用您的方法,或者在调用getDay("29", "9", "2017")
时执行Calendar.OCTOBER
。
查看此运行演示:https://ideone.com/A6WGRJ。我还添加了日期打印,以确认它打印正确的日期。