Метод getDay() для возврата дня недели на указанную дату не работает

Я пытаюсь выполнить задачу под названием " Дата и время Java" на HackerRank.

задача

Вам дана дата. Вам просто нужно написать метод getDay, который возвращает день этой даты. Например, если вам дается дата 14 августа 2017 года, метод должен возвращать MONDAY как день этой даты.

Я старался изо всех сил, чтобы сделать задачу, но я получаю либо 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());
    }
}

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));
}

Если вы хотите использовать LocalDate, вы можете использовать его таким образом

 import java.time.LocalDate;

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

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

    }

java.time.LocalDate

Современный подход использует классы java.time.

  1. Импортировать java.time.* чтобы получить доступ LocalDate & DayOfWeek классы.
  2. Написать getDay метод, который должен быть статическим, потому что он вызывается в основном методе.
  3. Получить localDate с помощью of метод, который принимает 3 аргумента в формате "int".
  4. преобразовать getDay аргументы метода в формате int.
  5. наконец, получить название этого дня, используя getDayOfWeek метод.

На этот вызов есть одно видео. Java Дата и Время Хакерранк

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.

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);

}
      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();
}
    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, если вы будете использовать прямую LocalDate, это покажет ошибку времени компиляции, т.е. не может найти символ, поэтому, пожалуйста, используйте java.time.

Вы можете использовать новый 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 января до 12 декабря. АLocalDateесть геттер для дня недели. Он возвращает константу изDayOfWeek enum, чей toString метод дает нам хорошо читаемую строку, такую ​​как MONDAY, опять же в отличие от того, что мы получаем из Calendar.

      public static String findDay(int month, int day, int year) {
     Calendar rightNow = Calendar.getInstance();
        rightNow.set(year, month-1, day);;
        switch(rightNow.get(Calendar.DAY_OF_WEEK)) {
            case Calendar.SUNDAY:
                return "SUNDAY";
            case Calendar.MONDAY:
                return "MONDAY";
            case Calendar.TUESDAY:
                return "TUEDAY";
            case Calendar.WEDNESDAY:
                return "WEDNESDAY";
            case Calendar.THURSDAY:
                return "THURSDAY";
            case Calendar.FRIDAY:
                return "FRIDAY";
            case Calendar.SATURDAY:
                return "SATURDAY";            
   
}

}

Другие вопросы по тегам