2010-08-04 18 views
5

Necesito comprobar si la fecha dada es después de hoy 23:59:59, ¿cómo puedo crear el objeto de fecha que es hoy 23:59:59?Fecha de vencimiento hoy en Java

+3

¿Quiere decir en o después de mañana a la medianoche? ¿O está interesado en el segundo entre 23:59:59 y 00:00:00? –

Respuesta

3

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

creo que podría estar acercando poco esto desde el ángulo equivocado, sin embargo. En lugar de tratar de crear una instancia de fecha que sea un átomo antes de la medianoche, un mejor enfoque podría ser crear la fecha que representa la medianoche y probar si la hora actual es estrictamente menos que ella. Creo que esto sería un poco más claro en cuanto a tus intenciones para que alguien más lea el código también.


Alternativamente, se puede utilizar una API Fecha de terceros que sabe cómo convertir de nuevo a la fecha. La API de fecha incorporada de Java generalmente se considera deficiente de muchas maneras. No recomendaría usar otra biblioteca solo para hacer esto, pero si tiene que hacer muchas manipulaciones de fecha y/o ya está usando una biblioteca como Joda Time, podría expresar este concepto de manera más simple. Por ejemplo, Joda Time tiene una clase DateMidnight que permite una comparación mucho más fácil con las fechas "en bruto" del tipo que estás haciendo, sin la posibilidad de problemas sutiles (como no configurar los milisegundos en mi primer corte).

+1

Con respecto a 'Calendar.getInstance()': tenga en cuenta que el 'Calendario' devuelto también contiene el valor actual durante milisegundos. No sabía eso y recientemente me llevó un día entero descubrir por qué 'igual()' siempre devolvía falso. – f1sh

+0

Buen punto f1sh: quizás el enfoque aquí sea un poco erróneo, vea próxima edición. –

+0

Solo incluya: cal.set (Calendario.MILLISECOND, 0); // o 999 –

0

Uso del Date.before(Date) o Date.after (Fecha)

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

Encuentra la fecha de mañana convertirlo en milisegundos se obtiene un valor de largo . resta -1 de ella y vuelve a convertir a la fecha en que obtendrás la fecha requerida.

ex: 12:00:00 de mañana lo convierten en milisegundos. obtendrá como mucho valor 312313564774 restar -1 obtendrá el tiempo EOD hoy en milisegundos

1

Esto crea una fecha en el futuro y lo compara con la fecha actual (establecido a finales de la tarde). Debería considerar usar la Biblioteca de tiempo 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 puede hacer esto más legible. Un ejemplo fácil se puede encontrar en el project website.

public boolean isRentalOverdue(DateTime datetimeRented) { 
    Period rentalPeriod = new Period().withDays(2).withHours(12); 
    return datetimeRented.plus(rentalPeriod).isBeforeNow(); 
} 
0

Supongo que usted quiso decir "es el dado java.util.Date después de hoy?".

Si es así, no se preocupe por determinar el último momento del día; eso es impracticable debido a la fraccion de segundo. Es mejor enfocarse solo en la fecha, sin la hora del día. Desea saber si la fecha del momento es posterior a la fecha del momento actual. Una zona horaria es crucial aquí.

tl; dr

ZoneId z = ZoneId.of(“America/Montreal”); // Time zone determines date. 
Boolean givenMomentIsAfterToday = myUtilDate.toInstant().atZone(z).toLocalDate().isAfter(LocalDate.now(z)); 

detalles

Está utilizando clases de fecha y hora viejos molestos ahora suplantado por las clases java.time.

Primero, convierta el dado java.util.Date en un Instant.Encuentre nuevos métodos de conversión agregados a las clases antiguas para convertir a/desde tipos java.time.

Instant

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds.

Instant instant = myUtilDate.toInstant(); 

LocalDate

La clase LocalDate representa un valor de sólo fecha sin la hora del día y sin zona horaria.

Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día cuando todavía está "ayer" en Montreal Québec.

ZoneId z = ZoneId.of(“America/Montreal”); 
LocalDate today = LocalDate.now(z); 

ZonedDateTime

Ajustar el instante en la misma zona horaria para la comparación de fechas.

ZonedDateTime zdt = instant.atZone(z); 

Interrogue por el valor de solo fecha, a LocalDate.

LocalDate ldt = zdt.toLocalDate(); 

Por último, compare los objetos LocalDate.

Boolean givenMomentIsAfterToday = ldt.isAfter(today); 

Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las antiguas clases problemáticas de fecha y hora como java.util.Date, .Calendar, & java.text.SimpleDateFormat. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad java.time está de vuelta-portado a Java 6 & 7 en ThreeTen-Backport y adaptado además para Android en ThreeTenABP (ver How to use…).

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.

Cuestiones relacionadas