Metoda getDay() pentru a returna ziua săptămânii pentru o anumită dată nu funcționează (Programare, Java, Data, Ziua Săptămânii, Java.Util.Calendar)

A spus a intrebat.

Încerc să completez sarcina numită Data și ora Java pe HackerRank.

Sarcina

Vi se dă o dată. Trebuie doar să scrieți metoda, getDay, care returnează ziua de la acea dată.De exemplu, dacă vi se dă data de 14 august 2017, metoda ar trebui să returneze LUNI ca fiind ziua de la acea dată.

Am încercat din răsputeri să fac această sarcină, dar primesc fie null rezultat fie NullPointerException eroare. Mă întreb unde greșesc. Mai jos este codul meu:

Mulțumesc anticipat!

Codul meu:

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

Comentarii

  • LocalDate.of( 2017 , 8 , 14 ).getDayOfWeek().toString() -> LUNI –  > Por Basil Bourque.
  • Cu excepția cazului în care aveți nevoie de el pentru a lucra pe codul moștenit, probabil că vă pierdeți timpul învățând API-uri învechite… –  > Por assylias.
  • @BasilBourque acesta este Java 8, nu-i așa? –  > Por Said.
  • @assylias Tocmai am început să fac provocările de pe HackerRank. Sunt un adevărat începător în programare, dar vreau să devin un programator bun și competitiv în cele din urmă. Dacă ai un sfat mai bun, mă bucur să-l aud 🙂 –  > Por A spus.
  • @SaidBuyukarslan The java.time sunt încorporate în Java 8 și ulterior. O mare parte din funcționalitatea lor este back-portată la Java 6 & 7 în ThreeTen-Backport proiect. Merită adăugat la proiectul dvs., deoarece clasele vechi sunt o mizerie îngrozitoare. Căutați în Stack Overflow pentru mai multe informații. Acest lucru a fost abordat deja de multe ori. –  > Por Basil Bourque.
7 răspunsuri
Elliott Frisch

return este oprit; nu vrei să cal.get în prima coloană din cal.getDisplayName. În prezent, obțin numele lunii cu codul tău. Schimbați-l în

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

Și apelați-l ca

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

Și obțin (așa cum era de așteptat)

Monday

În noul cod, ar trebui să prefera noile clase din java.time (Java 8+) și o clasă DateTimeFormatter – ca,

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

Comentarii

  • A funcționat cu adevărat, mulțumesc! Btw, am două întrebări rapide: 1. După linia cal.set(Integer.valueOf(year), (Integer.valueOf(month) - 1), Integer.valueOf(day));, , valoarea lui Calendar.DAY_OF_WEEK devine ziua efectivă a săptămânii, și nu ziua curentă a sistemului, corect? și 2. folosind cal.get(Calendar.DAY_OF_WEEK) pentru un apel de șir de caractere ar fi cel mai bine dacă vreau să am doar valoarea int a zilei. de exemplu: int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); (care returnează ceva între 1-7). –  > Por A spus.
  • 1: Calendar.DAY_OF_WEEK este un static final constantă 7. El nu „devine ziua actuală a săptămânii„, ci nu se schimbă niciodată. Este o constantă. Doi: Priviți Calendar.SUNDAY este o 1. Trei: Preferă clasele în java.time în loc de java.util.Calendar –  > Por Elliott Frisch.
  • Alternativ, în loc să apelați .format puteți apela .getDayOfWeek().getDisplayName pentru a localiza automat numele zilei săptămânii. –  > Por Basil Bourque.
Ravi Solanki

java.time.LocalDate

Abordarea modernă utilizează java.time clase.

  1. Importați java.time.* pentru a accesa LocalDate & DayOfWeek clase.
  2. Scrieți getDay care ar trebui să fie statică, deoarece este apelată în metoda principală.
  3. Recuperați localDate utilizând of care primește 3 argumente în format „int”.
  4. convertiți getDay argumentele metodei în format „int”.
  5. În cele din urmă, preluați numele zilei respective folosind getDayOfWeek metoda.

Există un videoclip pe această provocare.Java Data și ora 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`. 

Pentru Java 6 & 7, consultați ThreeTen-Backport proiect. Pentru Android anterior, consultați proiectul ThreeTenABP pentru a vedea proiectul

selahaddin aksu

dacă doriți să folosiți LocalDate, îl puteți utiliza în felul următor

 import java.time.LocalDate;

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

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

    }

Comentarii

  • Vă mulțumim pentru contribuție. Este cu siguranță o sugestie bună, cred că se regăsește deja în câteva dintre celelalte răspunsuri (cu foarte mici variații). –  > Por Ole V.V..
PawanSinghla
    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;    }

trebuie să folosiți java.time.LocalDate, dacă veți folosi direct LocalDate, acesta va afișa o eroare de compilare, adică nu poate găsi simbolul, așa că vă rugăm să folosiți java.time.LocalDate.

Comentarii

  • Puteți adăuga declarații de import import java.time.LocalDate; și import java.time.format.DateTimeFormatter;, , atunci nu mai aveți nevoie de calificări java.time și java.time.format în metodă. –  > Por Ole V.V..
  • Da , puteți face și asta –  > Por PawanSinghla.
Garima Garg

Puteți utiliza noul API Java8 DateTime.

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

A LocalDate este o dată fără ora din zi, deci bine pentru scopul nostru. of factory construiește data pe care o dorim. Contrar metodei Calendar folosită în întrebare, aceasta numerotează în mod normal lunile de la 1 pentru ianuarie la 12 pentru decembrie. A LocalDate are un getter pentru ziua săptămânii. Acesta returnează o constantă din clasa DayOfWeek enum a cărei toString ne oferă un șir de caractere ușor de citit, cum ar fi MONDAY, , din nou în contrast cu ceea ce obținem de la Calendar.

Comentarii

  • În timp ce acest cod poate rezolva întrebarea, includerea unei explicații despre cum și de ce rezolvă problema ar ajuta cu adevărat la îmbunătățirea calității mesajului dvs. și, probabil, ar duce la mai multe voturi pozitive. Nu uitați că răspundeți la întrebare pentru cititorii din viitor, nu doar pentru persoana care o pune acum. Vă rugăm să vă editați răspunsul pentru a adăuga explicații și pentru a da o indicație cu privire la limitările și ipotezele care se aplică. –  > Por Богдан Опир.
parub
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();
}

Comentarii

  • Vă recomand să nu folosiți Calendar. Clasa respectivă este prost concepută și de mult timp depășită. În schimb, utilizați LocalDate și DayOfWeek, , ambele din java.time, API-ul Java modern de date și ore.. –  > Por Ole V.V..
isurie
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);

}

Comentarii