En mi código necesito encontrar todas mis cosas que sucedieron hoy. Así que necesito comparar las fechas desde hoy a las 00:00 a.m. (medianoche de esta mañana) hasta las 12:00 p.m. (medianoche de esta noche).
Lo sé ...
Date today = new Date();
... me atrapa ahora mismo. Y ...
Date beginning = new Date(0);
... me da cero tiempo el 1 de enero de 1970. Pero, ¿cuál es una manera fácil de obtener cero tiempo hoy y cero tiempo mañana?
ACTUALIZAR; Hice esto, pero seguramente hay una manera más fácil.
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();
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .Respuestas:
java.util.Calendar
JDK 8: java.time.LocalTime y java.time.LocalDate
Joda-Time
Si está utilizando un JDK <8, recomiendo Joda Time , porque la API es realmente buena:
Dado que la versión 2.3 de Joda Time
DateMidnight
está en desuso , use esto:Pase una zona horaria si no desea la zona horaria predeterminada actual de la JVM.
fuente
toDateMidnight
está en desuso. Vea esta respuesta para más detalles: stackoverflow.com/a/19048833/363573ZonedDateTime
) como lo hizo en la sección Joda-Time. LosLocal…
tipos no tienen información de zona horaria; ese es su propósito completo, no perder / ignorar todos los detalles de compensación y zona horaria. Especialmente cuando la Pregunta habla sobre el uso de estos valores para la comparación (¿quizás consultas de bases de datos?), Es probable que un valor de fecha y hora dividido en zonas sea más útil.En aras de la exhaustividad, si está utilizando Java 8 , también puede utilizar el
truncatedTo
método de laInstant
clase para obtener la medianoche en UTC .Como está escrito en el Javadoc
Espero eso ayude.
fuente
Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
truncatedTo
yatStartOfDay
.La forma más fácil de encontrar una medianoche:
Día siguiente:
fuente
Recuerde,
Date
no se usa para representar fechas (!). Para representar la fecha necesitas un calendario. Esta:creará una
Calendar
instancia que represente la fecha actual en su zona horaria actual. Ahora lo que necesita es truncar cada campo debajo del día (hora, minuto, segundo y milisegundo) configurándolo en0
. Ahora tienes una medianoche hoy.Ahora para llegar a la medianoche del día siguiente, debe agregar un día:
Tenga en cuenta que agregar
86400
segundos o 24 horas es incorrecto debido al horario de verano que puede ocurrir mientras tanto.ACTUALIZACIÓN: Sin embargo, mi forma favorita de tratar este problema es usar la clase DateUtils de Commons Lang :
Utiliza
Calendar
detrás de escena ...fuente
estos métodos te ayudarán
y
fuente
A partir de JodaTime 2.3, el
toDateMidnight()
está en desuso.De la actualización de 2.2 a 2.3
Aquí hay un código de muestra sin
toDateMidnight()
método.Código
Salida ( puede ser diferente dependiendo de su zona horaria local )
fuente
DateTimeZone
instancia a eseDateTime
constructor para enfatizar la importancia de especificar una zona horaria en lugar de inadvertidamente dependiendo del valor predeterminado:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Otras respuestas son correctas, especialmente la respuesta java.time de arganzheng . Como algunos mencionaron, debe evitar las antiguas clases java.util.Date/.Calendar ya que están mal diseñadas, son confusas y problemáticas. Han sido suplantados por las clases java.time.
Permítanme agregar notas sobre la estrategia para manejar la medianoche y el lapso de tiempo .
Medio abierto
En el trabajo de fecha y hora, los períodos de tiempo a menudo se definen utilizando el enfoque "medio abierto". En este enfoque, el comienzo es inclusivo, mientras que el final es exclusivo . Esto resuelve los problemas y, si se usa de manera sistemática, facilita mucho el razonamiento sobre el manejo de la fecha y hora.
Un problema resuelto es definir el final del día. ¿Es el último momento del día
23:59:59.999
( milisegundos )? Tal vez, en la clase java.util.Date (desde el primer Java; problemático, ¡evite esta clase!) Y en la exitosa biblioteca Joda-Time . Pero en otro software, como una base de datos como Postgres, el último momento será23:59:59.999999
( microsegundos ). Pero en otro software como el framework java.time (integrado en Java 8 y posterior, sucesor de Joda-Time) y en alguna base de datos como la Base de datos H2 , el último momento podría ser23:59.59.999999999
( nanosegundos ). En lugar de partir los pelos, piense solo en el primer momento, no en el último.En Half-Open, un día transcurre desde el primer momento de un día y sube, pero no incluye el primer momento del día siguiente. Entonces, en lugar de pensar así:
... piensa así ...
En el trabajo de base de datos, este enfoque significa no usar el
BETWEEN
operador en SQL.Comienzo del día
Además, el primer momento del día no siempre es la hora del día
00:00:00.0
. El horario de verano (DST) en algunas zonas horarias, y posiblemente otras anomalías, puede significar que una hora diferente comienza el día.Así que deje que los java.time clases hacen el trabajo de determinar el comienzo de un día con una llamada a
LocalDate::atStartOfDay( ZoneId )
. Por lo tanto, debemos desviarnosLocalDate
y regresar a ellos,ZonedDateTime
como puede ver en este código de ejemplo.Tenga en cuenta el paso de lo opcional
ZoneId
. Si se omite, la zona horaria predeterminada actual de su JVM se aplica implícitamente. Mejor ser explícito.La zona horaria es crucial para el trabajo de fecha y hora. La pregunta y algunas otras respuestas son potencialmente defectuosas porque no manejan conscientemente la zona horaria.
Convertir
Si debe usar java.util.Date o .Calendar, busque nuevos métodos de conversión agregados a esas clases antiguas.
Lapso de tiempo
Por cierto, si está haciendo mucho trabajo con períodos de tiempo, eche un vistazo a:
Duration
Period
Interval
La
Interval
clase se encuentra en el proyecto ThreeTen-Extra , una extensión del marco java.time. Este proyecto es el campo de pruebas para posibles adiciones futuras a java.time.Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
java.time
Si está utilizando Java 8 y versiones posteriores, puede probar el paquete java.time ( Tutorial ):
fuente
Esto parece ser una opción:
para agregarle un día
o
Tengo el presentimiento de que este último se prefiere en caso de que algo extraño como el horario de verano provoque que agregar 24 horas no sea suficiente (consulte https://stackoverflow.com/a/4336131/32453 y sus otras respuestas).
fuente
Hice esto de manera diferente a todos los demás aquí. Soy nuevo en Java, así que tal vez mi solución es pobre.
No estoy seguro de que esto funcione todavía, pero de cualquier manera, agradecería cualquier comentario sobre esta solución.
Estoy confundido por la declaración anterior de que puedes calcular mañana llamando:
Si agrega 1 al día del mes y es el día 31, ¿no obtiene el día 32 del mes?
¿Por qué las horas / fechas no están todas basadas en UTC en Java? Creo que las zonas horarias solo deberían ser necesarias cuando se usan con E / S, pero internamente siempre deberían usarse en UTC. Sin embargo, las clases parecen incluir información de zona horaria que no solo es un desperdicio, sino que es propensa a errores de codificación.
fuente
Apache Commons Lang
http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#isSameDay(java.util.Date , java.util.Date)
fuente
La forma más sencilla con JodaTime
DateMidnight date = DateMidnight.now();
fuente
00:00:00.000
. En su lugar, use el nuevowithTimeAtStartOfDay
método. Actualice a la versión actual 2.4 de Joda-Time y lea las notas de la versión. Ejemplo:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Debido a que un día es
24 * 60 * 60 * 1000
ms, la medianoche de este día se puede calcular como ...fuente
Más o menos como las respuestas anteriores, pero nadie mencionó el parámetro AM_PM:
fuente
Calendar
clase problemática fue suplantada hace años por las clases java.time , específicamenteZonedDateTime
.fuente
Date
clase terrible fue suplantada hace años porjava.time.Instant
. Evite usarDate
hoy en día.Usando apache commons ..
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .Sé que esta es una publicación muy antigua. ¡Pensé compartir mi conocimiento aquí!
Para la fecha a media noche de hoy con la zona horaria exacta, puede usar los siguientes
Dónde
(1000*60 * 330)
se resta, es decir, en realidad está relacionado con la zona horaria, por ejemplo, la zona horaria india, es decir, kolkata difiere +5: 30hrs de la real. Restando eso con la conversión a milisegundos.Entonces cambie el último número restado de acuerdo con usted. Estoy creando un producto, es decir, solo con sede en India, así que solo utilicé una marca de tiempo específica.
fuente
Pero cuidado que
java.sql.Date.toInstant()
siempre tiraUnsupportedOperationException
.¿Via LocalDate a java.util.Date y viceversa, la conversión más simple?
fuente
De forma anticuada..
fuente
Date
.Date
clase siempre está en UTC. Por lo tanto, está ignorando el problema de la zona horaria deseada / esperada. Por ejemplo, un nuevo día amanece en Kolkata India muchas horas antes que en UTC, y horas más tarde que UTC en Montreal Québec.