come creare un oggetto Java Date di mezzanotte oggi e mezzanotte domani?


178

Nel mio codice devo trovare tutte le mie cose che sono successe oggi. Quindi ho bisogno di confrontare le date di oggi alle 00:00 (mezzanotte presto questa mattina) alle 12:00 (mezzanotte di stasera).

Lo so ...

Date today = new Date(); 

... mi prende subito. E ...

Date beginning = new Date(0);

... mi dà zero tempo il 1 ° gennaio 1970. Ma qual è un modo semplice per ottenere zero tempo oggi e zero tempo domani?

AGGIORNARE; L'ho fatto, ma sicuramente c'è un modo più semplice?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
Secondo me Joda Time è più facile, guarda la fine della mia risposta. Se vuoi usare java.util.Date/Calendar devi farlo in questo modo, non c'è modo più semplice per farlo.
timaschew,

RE: commento di timaschew per usare Joda-Time, sapere che il progetto Joda-Time è ora in modalità manutenzione e consiglia la migrazione alle classi java.time.
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
È raro vedere così tante risposte imperfette a una domanda come questa. Consiglio la risposta di Basil Bourque , è corretta e ben informata.
Ole VV,

Risposte:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime e java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Time

Se stai usando un JDK <8, consiglio Joda Time , perché l'API è davvero carina:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Poiché la versione 2.3 di Joda Time DateMidnightè obsoleta , utilizza questo:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

Passa un fuso orario se non desideri il fuso orario predefinito corrente della JVM.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

Grazie per l'aiuto, avevo appena aggiornato la mia domanda originale con come la stavo attualmente facendo. Grazie per il suggerimento

3
A partire da JodaTime 2.3, toDateMidnightè obsoleto. Vedere questa risposta per i dettagli: stackoverflow.com/a/19048833/363573
Stephan,

aggiunta una soluzione per JDK 8
timaschew il

1
@timaschew Sebbene generalmente corretto, suggerisco di fare java.time usando un valore di data-ora suddiviso in zone ( ZonedDateTime) come hai fatto nella sezione Joda-Time. I Local…tipi non hanno informazioni sul fuso orario, ovvero il loro intero scopo, non perdere / ignorare tutti i dettagli di fuso orario e offset. Soprattutto quando la domanda parla dell'utilizzo di questi valori per il confronto (forse query del database?), È probabile che un valore di data e ora suddiviso in zone sia più utile.
Basil Bourque,

1
@Amalgovinus Assicurati di impostare Calendar.HOUR_OF_DAY, non Calendar.HOUR.
Oswald,

43

Per completezza, se si utilizza Java 8 è anche possibile utilizzare il truncatedTometodo della Instantclasse per ottenere la mezzanotte in UTC .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Come scritto nel Javadoc

Ad esempio, il troncamento con l'unità MINUTES verrà arrotondato per difetto al minuto più vicino, impostando i secondi e i nanosecondi a zero.

Spero che sia d'aiuto.


1
Grazie per il suggerimento. Ottenere la mezzanotte al fuso orario specificato diventa più lungo:Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Vadzim


33

Il modo più semplice per trovare una mezzanotte:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Giorno dopo:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

Ho eseguito quel codice e ho ricevuto: Mezzanotte: gio 01 nov 19:00:00 CDT 2012
Dave

3
Se hai fatto qualcosa di simile a System.out.print (date), il sistema ha convertito l'istanza di data nel fuso orario di sistema (CDT). 7:00 in CDT è mezzanotte in GMT. Se è necessaria una mezzanotte in un fuso orario selezionato, è necessario aggiungere la differenza di questo fuso orario, tenendo conto dell'ora legale.
Andrei Volgin,

@Bouncner Lo è. Esistono molte "mezzanotte" diverse volte sulla Terra, indipendentemente dal metodo utilizzato, ma esiste solo una mezzanotte di Java.
Andrei Volgin,

2
@Andrei Volgin Non sapevo che ci fosse una "mezzanotte di Java". ;) Quello che volevo dire è che questa soluzione non aiuta davvero il creatore dell'argomento. Una soluzione di calendario evita brutti calcoli secondari e si occupa dei fusi orari (e in particolare dei tempi di risparmio della luce del giorno ecc.) Se usati correttamente. Non lo vedo nella tua soluzione.
Bouncner,

Ciao @AndreiVolgin, ho ottenuto con Date date = new Date (time + TimeZone.getDefault (). GetRawOffset () - time% (24 * 60 * 60 * 1000));
jrey,

28

Ricorda, Datenon è usato per rappresentare le date (!). Per rappresentare la data è necessario un calendario. Questo:

Calendar c = new GregorianCalendar();

creerà Calendarun'istanza che rappresenta la data attuale nel tuo fuso orario corrente. Ora è necessario troncare ogni campo al di sotto del giorno (ora, minuto, secondo e millisecondo) impostandolo su 0. Oggi hai una mezzanotte.

Ora per mezzanotte del giorno successivo, devi aggiungere un giorno:

c.add(Calendar.DAY_OF_MONTH, 1);

Si noti che l'aggiunta di 86400secondi o 24 ore non è corretta a causa dell'ora legale che potrebbe verificarsi nel frattempo.

AGGIORNAMENTO: Comunque il mio modo preferito di affrontare questo problema è usare la classe DateUtils di Commons Lang :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

Usa Calendardietro le quinte ...


15
Grazie per l'aiuto. "La data non è usata per rappresentare le date" - saremo abbastanza strabilianti, vero? ;)

@RobertHume Ad essere onesti, Date è in circolazione sin dalla prima versione di Java. La maggior parte delle cose di quell'epoca sono ... meno che perfettamente pensate. Soprattutto dal momento che Java è stato tra i primi a provare il genere di cose che stava provando, e c'era ben lungi dall'essere uno standard concordato su come farlo.
Finanzi la causa di Monica il

14

questi metodi ti aiuteranno-

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

e

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

A partire da JodaTime 2.3, il toDateMidnight() è obsoleto.

Da aggiornamento 2,2-2,3

    Deprecazioni dal 2.2
    ----------------------
    - DateMidnight [# 41]
     Questa classe è difettosa nel concetto
     L'ora di mezzanotte occasionalmente non si verifica in alcuni fusi orari
     Questo è il risultato dell'ora legale dalle 00:00 all'01: 00
     DateMidnight è essenzialmente un DateTime con un orario bloccato a mezzanotte
     Un tale concetto è generalmente più scarso da usare, dato LocalDate
     Sostituisci DateMidnight con LocalDate
     Oppure sostituiscilo con DateTime, magari usando il metodo withTimeAtStartOfDay ()

Ecco un codice di esempio senza toDateMidnight()metodo.

Codice

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Output ( potrebbe essere diverso a seconda del fuso orario locale )

2013-09-28 00:00:00

2
Risposta eccellente. Vorrei aggiungere il passaggio di DateTimeZoneun'istanza a quel DateTimecostruttore per sottolineare l'importanza di specificare un fuso orario piuttosto che inavvertitamente a seconda del valore predefinito:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque,

9

Altre risposte sono corrette, in particolare la risposta java.time di arganzheng . Come alcuni hanno già detto, dovresti evitare le vecchie classi java.util.Date/.Calendar in quanto sono progettate male, confuse e fastidiose. Sono stati soppiantati dalle classi java.time.

Vorrei aggiungere note sulla strategia di gestione della mezzanotte e degli intervalli di tempo .

Mezzo aperto

Nel lavoro con data e ora, gli intervalli di tempo sono spesso definiti usando l'approccio "Half-Open". In questo approccio l'inizio è inclusivo mentre il finale è esclusivo . Ciò risolve i problemi e, se utilizzato in modo coerente, rende molto più semplice il ragionamento sulla gestione della data e dell'ora.

Un problema risolto è la definizione della fine della giornata. È l'ultimo momento della giornata 23:59:59.999( millisecondi )? Forse, nella classe java.util.Date (dalla prima Java; problematica - evita questa classe!) E nella libreria Joda-Time di grande successo . Ma in altri software, come database come Postgres, l'ultimo momento sarà 23:59:59.999999( microsecondi ). Ma in altri software come il framework java.time (integrato in Java 8 e versioni successive, successore di Joda-Time) e in alcuni database come il database H2 , l'ultimo momento potrebbe essere 23:59.59.999999999( nanosecondi ). Piuttosto che spaccare i capelli, pensa solo in termini di primo momento, non ultimo.

In Half-Open, un giorno parte dal primo momento di un giorno e va fino a, ma non include il primo momento del giorno successivo. Quindi, piuttosto che pensare in questo modo:

... da oggi alle 00:00 (mezzanotte presto questa mattina) alle 12:00 (mezzanotte stasera).

... pensa così ...

dal primo momento di oggi fino al primo momento di domani escluso:
(> = 00:00:00.0oggi E < 00:00:00.0domani)

Nel lavoro con database, questo approccio significa non usare l' BETWEENoperatore in SQL.

Inizio giornata

Inoltre, il primo momento della giornata non è sempre l'ora del giorno 00:00:00.0. L'ora legale (DST) in alcuni fusi orari, e possibilmente altre anomalie, può significare che un'ora diversa inizia il giorno.

Quindi lascia che le classi java.time facciano il lavoro per determinare l'inizio di una giornata con una chiamata a LocalDate::atStartOfDay( ZoneId ). Quindi dobbiamo deviare LocalDatee tornare a ZonedDateTimecome puoi vedere in questo codice di esempio.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Nota il passaggio dell'opzionale ZoneId. Se omesso, il fuso orario predefinito corrente di JVM viene applicato implicitamente. Meglio essere espliciti.

Il fuso orario è fondamentale per il lavoro data-ora. La domanda e alcune altre risposte sono potenzialmente imperfette perché non gestiscono consapevolmente il fuso orario.

Convertire

Se è necessario utilizzare java.util.Date o .Calendar, cercare nuovi metodi di conversione aggiunti a quelle vecchie classi.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Lasso di tempo

A proposito, se stai facendo molto lavoro con intervalli di tempo, dai un'occhiata a:

  • Duration
  • Period
  • Interval
    La Intervalclasse si trova nel progetto ThreeTen-Extra , un'estensione del framework java.time. Questo progetto è il banco di prova per possibili aggiunte future a java.time.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*classi.

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


6

java.time

Se si utilizza Java 8 e versioni successive, è possibile provare il pacchetto java.time ( Tutorial ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
Buona risposta. Suggerirei di specificare il fuso orario desiderato / previsto. L'attuale fuso orario predefinito della JVM può variare a seconda delle impostazioni del sistema operativo, della modifica dei computer o di qualsiasi app in qualsiasi thread della JVM che modifica l'impostazione predefinita in qualsiasi momento durante il runtime.
Basil Bourque,

4

Questa sembra essere un'opzione:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

per aggiungere anche un giorno

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

o

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

Ho il sospetto che quest'ultimo sia preferito in caso di qualcosa di strano come l'ora legale che causa l'aggiunta di 24 ore per non essere abbastanza (vedi https://stackoverflow.com/a/4336131/32453 e le sue altre risposte).


Ho una data e ora del giorno rappresentate come lunghe nel mio database sqlite. Devo dedicare molto all'inizio del giorno successivo. Posso ancora usare un oggetto Date con il mio long piuttosto che con il metodo SimpleDateFormat che usi sopra?
AJW,

1
Finché sono i millisecondi giusti, puoi passarlo come costruttore: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack,

1

L'ho fatto diversamente da tutti gli altri qui. Sono nuovo di Java, quindi forse la mia soluzione è scadente.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Non sono ancora sicuro che funzioni, ma in ogni caso apprezzerei qualsiasi feedback su questa soluzione.

Sono confuso dall'affermazione sopra che puoi calcolare domani chiamando:

c.add(Calendar.DAY_OF_MONTH, 1);

Se aggiungi 1 al giorno del mese ed è il 31 ° giorno, non ottieni il 32 ° giorno del mese?

Perché gli orari / le date non sono tutti basati su UTC in Java? Penso che i fusi orari dovrebbero essere necessari solo se utilizzati con l'I / O, ma internamente dovrebbero sempre essere utilizzati in UTC. Tuttavia, le classi sembrano includere informazioni sul fuso orario che sembrano non solo dispendiose, ma soggette a errori di codifica.


2
Ciao mitch Penso che la tua soluzione funzioni, ma sembra che il costruttore Date sia obsoleto. La gente di Java ha deprecato la maggior parte dei metodi relativi a Date originali qualche tempo fa e li ha sostituiti con metodi più recenti relativi a Calendar. Personalmente non vedo come sia un miglioramento, ma è disapprovato dall'uso di metodi deprecati. Grazie!

Triste per la deprecazione. Mi sembra molto più preciso specificare l'anno, il mese e la data anziché cancellare l'ora, i minuti, i secondi e i millisecondi. L'eliminazione di questi dati si basa sul fatto che i millisecondi rappresentano la massima granularità della classe Date, mentre la mia soluzione no. La mia soluzione è anche più breve e più chiara. Essere nuovo a Java mi fa davvero apprezzare quanto sia pulito, semplice ed efficiente C ++ quando si tratta di usare date e orari.
Mitch,

@Mitch Nella mia esperienza, la lingua più recente che stai imparando è sempre percepita come la più complicata.
ArtOfWarfare il

Cordiali saluti: queste sanguinose e terribili vecchie lezioni di data e ora sono ormai legacy, soppiantate dalle moderne classi java.time.
Basil Bourque,


0

Il modo più semplice con JodaTime

DateMidnight date = DateMidnight.now();


2
No. Le classi e i metodi relativi alla "mezzanotte" in Joda-Time sono stati tutti deprecati. Erano basati su un concetto imperfetto. Il primo momento della giornata non è sempre 00:00:00.000. Usa invece il nuovo withTimeAtStartOfDaymetodo. Aggiorna alla versione 2.4 attuale di Joda-Time e leggi le note di rilascio. Esempio:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque,

0

A causa di un giorno è 24 * 60 * 60 * 1000ms, la mezzanotte di questo giorno può essere calcolata come ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
Questo codice si applica solo a UTC e nessun altro fuso orario e ignora anomalie come l'ora legale. Inoltre, le soluzioni roll-your-own date-time non sono sagge in quanto questo è un argomento sorprendentemente complicato. Utilizzare invece le eccellenti classi java.time.
Basil Bourque,

0

Praticamente come le risposte prima, ma nessuno ha menzionato il parametro AM_PM:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
La Calendarclasse problematica è stata soppiantata anni fa dalle classi java.time , in particolare ZonedDateTime.
Basil Bourque,

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

Funziona solo con UTC e non riesce a gestire i fusi orari. Inoltre, la Dateclasse terribile è stata soppiantata anni fa da java.time.Instant. Evitare di utilizzare al Dategiorno d'oggi.
Basil Bourque,

0

Uso di Apache Commons.

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

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,

@BasilBourque concordato per Java 8. Ma se OP utilizza Java 7, suppongo che funzionerebbe comunque.
joe4java,

Quasi tutte le funzionalità java.time sono disponibili per Java 6 e 7 nel progetto ThreeTen-Backport con API praticamente identiche. Adattato ulteriormente per Android <26 nel progetto ThreeTenABP . Quindi non c'è bisogno di usare mai più quelle miserabili vecchie classi data-ora.
Basil Bourque,

-1

So che questo è un post molto vecchio. Ho pensato di condividere le mie conoscenze qui!

Per la data Oggi a mezzanotte con il fuso orario esatto è possibile utilizzare quanto segue

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

Dove (1000*60 * 330) viene sottratto, ovvero effettivamente correlato al fuso orario, ad esempio il fuso orario indiano, ovvero Calcutta, differisce di +5: 30 ore dall'attuale. Sottraendo così quello con la conversione in millisecondi.

Quindi cambia l'ultimo numero sottratto secondo te. Sto creando un prodotto, ovvero basato solo in India, quindi ho usato solo il timestamp specifico.


1
Perché consiglieresti questo invece della risposta accettata? Rotolare i valori di data e ora è rischioso in generale. In particolare questo codice è codificato per sempre sull'offset corrente di un singolo fuso orario. Non esiste una contabilità per l'ora legale o altre anomalie. Vedo solo aspetti negativi senza valore aggiunto.
Basil Bourque,

@Basil ovviamente accetto la risposta e sì, ho accennato lì per un valore codificato. Questo è utile solo nel caso tu stia lavorando su un fuso orario specifico.
Rajeev,

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Ma attenzione che java.sql.Date.toInstant()genera sempre UnsupportedOperationException.

Via LocalDate a java.util.Date e viceversa la conversione più semplice?


Non è una buona risposta. Stai mescolando l'uso del moderno java.time con le vecchie classi legacy che soppiantano. In particolare, si utilizzano le classi data-ora java.sql che devono essere utilizzate solo per lo scambio di dati con un database il cui driver non è stato ancora aggiornato per gestire direttamente le classi java.time, da non utilizzare mai per la logica aziendale. Ancora un altro problema è che si ignora la questione cruciale del fuso orario.
Basil Bourque,

@BasilBourque, grazie per la critica. L'uso di una classe legacy non contrassegnata come obsoleta per ottenere un'altra istanza della classe legacy è abbastanza sicuro. Il problema del fuso orario è più importante. Ho deciso di attenermi alla risposta di riccardo dopo tutto.
Vadzim,

-1

Vecchio stile ..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

Quella classe problematica fu soppiantata anni fa dalla classe java.time.Instant . Non c'è bisogno di usarlo mai Date.
Basil Bourque,

Quella Dateclasse è sempre in UTC. Quindi stai ignorando il problema del fuso orario desiderato / previsto. Ad esempio, un nuovo giorno nasce a Calcutta in India molte ore prima rispetto a UTC e ore dopo UTC a Montréal Québec.
Basil Bourque,
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.