Voglio ottenere Anno, Mese, Giorno, ecc. Da Java Date da confrontare con la data del Calendario Gregoriano in Java. È possibile?


231

Ho un oggetto Date in Java memorizzato come tipo Date di Java.

Ho anche una data di creazione del calendario gregoriano. La data del calendario gregoriano non ha parametri e quindi è un'istanza della data (e ora?) Di oggi.

Con la data java, voglio essere in grado di ottenere l'anno, il mese, il giorno, l'ora, i minuti e i secondi dal tipo di data java e confrontare la data del calendario gregoriano.

Ho visto che al momento la data di Java è memorizzata come lunga e gli unici metodi disponibili sembrano scrivere solo il lungo come una stringa di data formattata. C'è un modo per accedere ad anno, mese, giorno, ecc.?

Ho visto che i getYear(), getMonth()metodi, ecc per Dateclasse sono stati deprecati. Mi chiedevo quale fosse la migliore pratica per usare l'istanza di Java Date che ho con la GregorianCalendardata.

Il mio obiettivo finale è quello di fare un calcolo della data in modo da poter verificare che la data di Java sia entro così tante ore, minuti ecc. Della data e ora di oggi.

Sono ancora un novizio di Java e mi sto un po 'sconcertando.


1
Ehi, qualunque cosa tu usi non usi Date.getYear(). Soffre di problemi (che non conosco). Date.getYear()una volta analizzato il mio appuntamento il 30/06/2017 e mi è tornato l'anno 117. Guarda dove è atterrato, duemila anni fa. Ma quando stampo semplicemente l'oggetto Date, l'output andava bene Date.getYear();.
Seenivasan,

FYI: Stai utilizzando vecchie classi Date-time fastidiose che sono ora legacy, soppiantate dalle moderne classi java.time.
Basil Bourque,

Risposte:


545

Usa qualcosa come:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

Attenzione, i mesi iniziano da 0, non da 1.

Modifica : da Java 8 è meglio usare java.time.LocalDate piuttosto che java.util.Calendar . Vedi questa risposta per come farlo.


4
Puoi usare l' cal.add(Calendar.DAY_OF_MONTH, -48)aritmetica del giorno sugli oggetti del Calendario. E puoi confrontare due oggetti Calendario usando cal.compareTo(anotherCal).
Florent Guillaume,

1
Fantastico, evviva Florent! Quanto sopra indica che il calendario restituirà anno e giorno aggiornati, secondi, minuti e secondi quando vengono utilizzati i metodi di acquisizione del calendario? Dave
daveb,

11
Si noti che il mese inizia con 0 e non 1 (ovvero gennaio = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo,

10
Perché JAVA è così scomodo?
Kimchi Man,

3
Perché la data e il calendario sono vecchi e mal progettati. Java 8 ha oggetti data / time molto migliori, vedi oracle.com/technetwork/articles/java/…
Florent Guillaume,

88

Con Java 8 e versioni successive, è possibile convertire l' oggetto Date in un oggetto LocalDate e quindi ottenere facilmente anno, mese e giorno.

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

Si noti che getMonthValue()restituisce un valore int compreso tra 1 e 12.


10
Ora è il 2016, credo che l'utilizzo LocalDatein Java 8 sia la migliore soluzione che ti fa risparmiare tempo, un'altra soluzione che usa Calendared Dateè piena di problemi.
AnnieFromTaiwan,

2
Ottima risposta - sicuramente la cosa migliore da usare java.time ed evitare le vecchie fastidiose lezioni di data e ora. Inoltre, nota come questa risposta risolve saggiamente il problema del fuso orario. Per ogni dato momento, la data varia in tutto il mondo in base al fuso orario.
Basil Bourque,

1
Sfortunatamente livello API 26+ per Android.
Wiktor Kalinowski,

14

Potresti fare qualcosa del genere, spiegherà come funziona la Dateclasse.

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

Ciao JavaCity, grazie per questo. questo è molto utile. Al momento sto cercando di evitare di analizzare una stringa di date. Dovrò eseguire questa analisi in seguito, tuttavia, quando indurrò gli utenti della mia applicazione a impostare anno, giorno e mese. Stavo per costruire una stringa per analizzare in SimpleDateFormat. Quanto sopra è molto utile per vederlo in azione. La mia data Java è stata creata come data e ora dalla sua istanza il giorno fa. Ora sto cercando di confrontare con la data del calendario gregoriano che è stata istanziata oggi. Grazie sinceri
daveb,

8
Correggi il codice ... le lettere minuscole mmindicano i minuti, le lettere maiuscole MMindicano il mese dell'anno.
YoYo

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

EDIT: l'output per date= Fri Jun 15 09:20:21 CEST 2018è:

DAY FRIDAY
MONTH JUNE
YEAR 2018

Se avessi messo almeno l'output, le persone potrebbero decidere se questo potrebbe essere utile a loro o no senza dover eseguire il codice.
SantiBailors,

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
Le risposte su Stack Overflow dovrebbero avere qualche discussione e spiegazione, non solo frammenti di codice. E il tuo codice potrebbe sicuramente usare qualche spiegazione.
Basil Bourque,

1
Cordiali saluti, le vecchie classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (la soluzione di calendario) è dieci volte più veloce. Ora hai aaaa MM gg 00 00 00, quindi confronta utilizzando date.compare


2

Potrebbe essere più facile

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

Siate attentamente montate a partire da 0 e non 1. E anche Calendar usa pm come am, quindi fate molta attenzione quando usate Hours e minuti.

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
Meglio usare il moderno java.time che soppianta queste fastidiose classi legacy mostrate qui. Vedi risposta corretta
Basil Bourque,

Grazie per la risposta e il suggerimento. È molto meglio.
Harun Ugur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.