Метод 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.
- Импортировать
java.time.*
чтобы получить доступLocalDate
&DayOfWeek
классы. - Написать
getDay
метод, который должен быть статическим, потому что он вызывается в основном методе. - Получить localDate с помощью
of
метод, который принимает 3 аргумента в формате "int". - преобразовать
getDay
аргументы метода в формате int. - наконец, получить название этого дня, используя
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";
}
}