Ho bisogno di verificare se data data è dopo oggi 23:59:59, come posso creare un oggetto data che è oggi 23:59:59?Data di scadenza oggi in Java
risposta
Uso java.util.Calendar:
Calendar cal = Calendar.getInstance(); // represents right now, i.e. today's date
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999); // credit to f1sh
Date date = cal.getTime();
penso che si potrebbe essere avvicinando questo da un po 'l'angolo sbagliato, però. Invece di provare a creare un'istanza di Date che è un atomo prima di mezzanotte, un approccio migliore potrebbe essere quello di creare la Data che rappresenta la mezzanotte e verificare se l'ora corrente è rigorosamente inferiore. Credo che questo sarebbe un po 'più chiaro in termini di tue intenzioni a qualcun altro che legge il codice.
In alternativa, è possibile utilizzare un'API Date di terze parti che sa come riconvertirsi. L'API di data built-in di Java è generalmente considerata carente in molti modi. Non consiglierei di usare un'altra libreria solo per farlo, ma se devi fare molta manipolazione della data e/o stai già usando una libreria come Joda Time potresti esprimere questo concetto più semplicemente. Ad esempio, Joda Time ha una classe DateMidnight
che consente un confronto molto più facile con le date "raw" del tipo che stai facendo, senza la possibilità di problemi sottili (come non impostare i millisecondi nel mio primo taglio).
Per quanto riguarda 'Calendar.getInstance()': Tenere presente che il 'Calendario' restituito contiene anche il valore corrente per millisecondi. Non lo sapevo e recentemente mi ci è voluto un giorno intero per scoprire perché 'equals()' ha sempre restituito false. – f1sh
Buon punto f1sh - forse l'approccio qui è leggermente sbagliato, vedere la prossima modifica. –
Basta includere: cal.set (Calendario.MILLISECOND, 0); // o 999 –
Usare il
Date.before(Date) o Date.after (Data)
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MINUTE, 59);
Date d = c.getTime()
Date x = // other date from somewhere
x.after(d);
Trova la data di domani convertirla in millisecondi si ottiene un valore di lungo . sottrarre -1 da esso e di nuovo convertire in data si otterrà la data richiesta.
es: 12:00:00 di domani convertirlo in millisecondi. si otterrà come un lungo valore di 312.313.564.774 sottrarre -1 otterrete oggi il tempo in millisecondi EOD
Questo crea una data futura e la confronta con la data corrente (impostato a tarda sera). Dovresti prendere in considerazione l'utilizzo della libreria di tempo Joda.
long timeStampOfTomorrow = new Date().getTime() + 86400000L;
Date dateToCheck = new Date(timeStampOfTomorrow);
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 23);
today.set(Calendar.MINUTE, 59);
today.set(Calendar.SECOND, 59);
today.set(Calendar.MILLISECOND, 999);
boolean isExpired = dateToCheck.after(today.getTime());
Con Joda Time Library si potrebbe fare questo più leggibile. Un semplice esempio può essere trovato su project website.
public boolean isRentalOverdue(DateTime datetimeRented) {
Period rentalPeriod = new Period().withDays(2).withHours(12);
return datetimeRented.plus(rentalPeriod).isBeforeNow();
}
Suppongo che intendessi "è il dato java.util.Date dopo oggi?".
Se è così, non si agiti per determinare l'ultimo momento della giornata; ciò è impossibile a causa del secondo frazionario. Meglio concentrarsi solo sulla data, senza l'ora del giorno. Vuoi sapere se la data-solo del momento dato è dopo la data-solo del momento corrente. Un fuso orario è cruciale qui.
tl; dr
ZoneId z = ZoneId.of(“America/Montreal”); // Time zone determines date.
Boolean givenMomentIsAfterToday = myUtilDate.toInstant().atZone(z).toLocalDate().isAfter(LocalDate.now(z));
dettagli
Si utilizza classi data-ora vecchi fastidiosi ora soppiantato dalle classi java.time.
Innanzitutto, convertire lo java.util.Date
in uno Instant
.Trova nuovi metodi di conversione aggiunti alle vecchie classi per la conversione in/da tipi java.time.
Instant
La classe Instant
rappresenta un momento sulla timeline in UTC con una risoluzione di nanoseconds.
Instant instant = myUtilDate.toInstant();
LocalDate
La classe LocalDate
rappresenta un valore di data-solo senza tempo del giorno e senza fuso orario.
Un fuso orario è fondamentale per determinare una data. Per un dato momento, la data varia in tutto il mondo per zona. Ad esempio, pochi minuti dopo la mezzanotte a Parigi, la Francia è un nuovo giorno mentre è ancora "ieri" a Montréal Québec.
ZoneId z = ZoneId.of(“America/Montreal”);
LocalDate today = LocalDate.now(z);
ZonedDateTime
Regolare l'istante nello stesso fuso orario per il confronto di date.
ZonedDateTime zdt = instant.atZone(z);
Interrogare per il valore di data-only, un LocalDate
.
LocalDate ldt = zdt.toLocalDate();
Infine, confrontare i LocalDate
oggetti.
Boolean givenMomentIsAfterToday = ldt.isAfter(today);
Chi java.time
Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data-ora come java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione a java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni.
Molte delle funzionalità java.time è back-porting di Java 6 & 7 in ThreeTen-Backport e in seguito atto a Android in ThreeTenABP (vedi How to use…).
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e altro.
Intendi domani o dopo domani a mezzanotte? O sei interessato al secondo tra le 23:59:59 e le 00:00:00? –