【问题标题】:Finding the day of week of a given date [duplicate]查找给定日期的星期几[重复]
【发布时间】:2017-10-29 07:55:18
【问题描述】:

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

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

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 日,它返回“星期三”。 谁能帮我解决这个问题?

【问题讨论】:

  • 你真的必须使用Calendar而不是更现代的java.time API吗? LocalDate 比这要好得多。 (另外,以日/月/年而不是年/月/日的顺序接受参数感觉很奇怪;为什么接受它们作为字符串而不是整数?如果调用代码只有字符串,它可以自己执行解析.)
  • @JonSkeet 是的,我试过 LocalDate。这比使用日历更好。

标签: java datetime calendar datetime-format dayofweek


【解决方案1】:

假设你使用的是 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 和 year(确保正确调用它)。我用

测试了上述内容
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 会从 1 获取一个 month 偏移量(Calendar#JANUARY 是 0)。所以你需要(并且更喜欢parseInt 到valueOf,第一个返回一个原语 - 第二个是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];
}

这给出了与上面相同的结果。

【讨论】:

  • 最后一部分不正确。查看此打印的年份 -> ideone.com/8N5UQJ。 “从 1900 年偏移”部分用于 java.util.Date(int year, int month, int date)
  • @Vasan 哇。固定的。谢谢。
  • @ElliottFrisch 成功了。我在“月份”参数中添加了 -1。非常感谢。
  • DayOfWeek::getDisplayName 将自动本地化该 DayOfWeek 对象的名称。
【解决方案2】:

Calendar 中的月份基于 cal.set(int,int,int) 为零。如果我用getDay("29", "9", "2017") 调用你的方法,它会返回星期日。所以用少一个月即 9 来调用你的方法,或者用当月的日历常量 (Calendar.OCTOBER) 调用它,或者在调用 cal.set 时执行 month+1。

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

【讨论】:

  • @ElliottFrisch 我相信你在想java.util.Date。
  • 是的,我在月份中添加了 -1。现在它工作正常。谢谢。
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多