J'essaie de terminer la tâche nommée Java Date and Time sur HackerRank.
Tâche
On vous donne une date. Vous avez juste besoin d'écrire la méthode, getDay, qui renvoie le jour à cette date.Par exemple, si on vous donne la date, Le 14 août 2017, la méthode devrait renvoyer LUNDI comme le jour sur celui-ci rendez-vous amoureux.
J'ai fait de mon mieux pour accomplir cette tâche, mais j'obtiens soit le résultat null
, soit l'erreur NullPointerException
. Je me demande où je me trompe. Ci-dessous mon code:
Merci d'avance!
Mon code:
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());
}
}
Votre return
est éteint; vous ne voulez pas cal.get
dans la première colonne de cal.getDisplayName
. Actuellement, je reçois le nom du mois avec votre code. Changer cela en
return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
Et appelle ça comme
public static void main(String[] args) {
System.out.println(getDay("14", "8", "2017"));
}
Et je reçois (comme prévu)
Monday
Dans le nouveau code, je préférerais les nouvelles classes de Java.time
(Java 8+) et un 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));
}
Java.time.LocalDate
L'approche moderne utilise les classes Java.time.
Java.time.*
pour accéder à LocalDate
& DayOfWeek
classes.getDay
qui devrait être statique car elle est appelée dans la méthode principale.of
qui prend 3 arguments au format "int".getDay
au format int.getDayOfWeek
.Il y a une vidéo de ce défi . 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`.
Pour Java 6 et 7, voir le projet ThreeTen-Backport. Pour les versions antérieures d'Android, voir le projet 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);
}