getDay()方法返回给定日期的星期几不起作用

时间:2018-02-16 05:39:34

标签: java date dayofweek java.util.calendar

我正在尝试在HackerRank上完成名为 Java日期和时间的任务。

任务

  

你有一个约会。你只需要编写方法getDay即可   返回该日期的日期。例如,如果您获得日期,   2017年8月14日,该方法应该返回星期一作为该日   日期。

我尽力完成任务,但收到null结果或NullPointerException错误。我想知道我哪里做错了。以下是我的代码:

提前致谢!

我的代码:

import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        System.out.println(getDay(day, month, year));
    }

    public static String getDay(String day, String month, String year) {
        Calendar cal = Calendar.getInstance();
        cal.set(Integer.valueOf(year), (Integer.valueOf(month) - 1), Integer.valueOf(day));
        return cal.getDisplayName(cal.get(Calendar.DAY_OF_WEEK), Calendar.LONG, Locale.getDefault());
    }
}

7 个答案:

答案 0 :(得分:8)

您的return已关闭;您不希望cal.get的第一列中有cal.getDisplayName。目前,我使用您的代码获取月份名称。将其更改为

return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());

并称之为

public static void main(String[] args) {
    System.out.println(getDay("14", "8", "2017"));
}

我得到(正如预期的那样)

Monday

在新代码中,我首选 java.time(Java 8+)中的新类,以及DateTimeFormatter - 类似

public static String getDay(String day, String month, String year) {
    int y = Integer.parseInt(year), m = Integer.parseInt(month), d = Integer.parseInt(day);
    return java.time.format.DateTimeFormatter.ofPattern("EEEE")
            .format(LocalDate.of(y, m, d));
}

答案 1 :(得分:3)

java.time.LocalDate

现代方法使用 java.time 类。

  1. 导入java.time.*以访问LocalDateDayOfWeek类。
  2. 编写getDay方法,该方法应该是静态的,因为它是在main方法中调用的。
  3. 使用of方法检索localDate,该方法采用“ int”格式的3个参数。
  4. 以int格式转换getDay方法参数。
  5. 最后使用getDayOfWeek方法检索当天的名称。

有一个关于这一挑战的视频。 Java Date and Time Hackerrank

LocalDate                 // Represent a date-only value, without time-of-day and without time zone.
.of( 2018 , 1 , 23 )      // Pass year-month-day, 1-12 for January-December. 
.getDayOfWeek()           // Obtain a `DayOfWeek` enum object.
.getDisplayName(          // Automatically localize the name of the day-of-week.
    TextStyle.FULL ,      // How long or abbreviated.
    Locale.US             // Or Locale.CANADA_FRENCH or so on.
)                         // Returns `String` such as `Monday` or `lundi`. 

对于Java 6和7,请参见 ThreeTen-Backport 项目。对于早期的Android,请参见 ThreeTenABP 项目。

答案 2 :(得分:1)

    public static String getDay(int month, int day, int year) {
   String  res= java.time.format.DateTimeFormatter.ofPattern("EEEE")
        .format(java.time.LocalDate.of(year, month, day));
   return res;    }

必须使用java.time.LocalDate,如果u将直接使用LocalDate,则其显示编译时间错误,即找不到符号,因此请使用java.time。

答案 3 :(得分:1)

您可以使用新的Java8 DateTime API。

public static String getDay(int day, int month, int year) 
{
    LocalDate dt=LocalDate.of(year, month, day);
    System.out.println("day: " + dt.getDayOfWeek().toString());
    return dt.getDayOfWeek().toString();
}

LocalDate是一个没有一天中的时间的日期,对于我们的目的来说很好。 of工厂方法构造所需的日期。与问题中使用的Calendar类相反,它从1月的1到12月的12合理地对月份进行了编号。 LocalDate在星期几有一个吸气剂。它从DayOfWeek枚举返回一个常量,该常量的toString方法为我们提供了一个很好的可读字符串,例如MONDAY,这与我们从Calendar获得的相反。

答案 4 :(得分:1)

如果您想使用LocalDate,可以以这种方式使用

 import java.time.LocalDate;

 public static String getDay(int month, int day, int year) {

    return LocalDate.of(year, month, day).getDayOfWeek().name();

    }

答案 5 :(得分:1)

public static String findDay(int month, int day, int year) {
 Calendar cal = Calendar.getInstance();
    cal.set(year, (month - 1), day);
    String dayOfWeek = cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
    return dayOfWeek.toUpperCase();
}

答案 6 :(得分:0)

public static void main(String[] args){
    String inputDateStr = String.format("%s/%s/%s", 23, 04, 1995);
    Date inputDate = null;
    try {
        inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr);
    } catch (ParseException ex) {
        Logger.getLogger(JavaApplication28.class.getName()).log(Level.SEVERE, null, ex);
    }
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(inputDate);
    String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();
    System.out.println(dayOfWeek);

}