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 ser 23: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í:
... desde hoy a las 00:00 a.m. (medianoche de esta mañana) hasta las 12:00 p.m. (medianoche de esta noche).
... piensa así ...
desde el primer momento de hoy hasta el primer momento de mañana:
(> = 00:00:00.0hoy Y < 00:00:00.0mañana)
En el trabajo de base de datos, este enfoque significa no usar el BETWEENoperador 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 desviarnos LocalDatey regresar a ellos, ZonedDateTimecomo puede ver en este código de ejemplo.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
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.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Lapso de tiempo
Por cierto, si está haciendo mucho trabajo con períodos de tiempo, eche un vistazo a:
Duration
Period
Interval
La Intervalclase 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, y SimpleDateFormat.
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 .