Tengo un problema al restablecer las horas en Java. Para una fecha determinada, quiero establecer el horario en 00:00:00.
Este es mi codigo:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
El problema es que a veces el tiempo es 12:00:00
y otras veces es 00:00:00
y cuando consulto la base de datos para una entidad en la que se guardó 07.02.2013 00:00:00
y el tiempo real de la entidad, que está almacenado, 12:00:00
falla la consulta.
Yo se eso 12:00:00 == 00:00:00
!
Estoy usando AppEngine. ¿Se trata de un error, un problema del motor o algún otro problema? ¿O depende de otra cosa?
java
java.util.calendar
Adelin
fuente
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el tutorial de Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
, para mi propósito, funciona bien.Respuestas:
Use otra constante en lugar de
Calendar.HOUR
useCalendar.HOUR_OF_DAY
.Calendar.HOUR
usa 0-11 (para usar con AM / PM) yCalendar.HOUR_OF_DAY
usa 0-23.Para citar los Javadocs:
y
Pruebas ("ahora" es actualmente a las 14:55 del 23 de julio de 2013, hora de verano del Pacífico):
Salida:
fuente
Calendar.HOUR
no establecería PM en AM, dejándolo como 12:00 del mediodía.java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el tutorial de Oracle .java.time
Usando el
java.time
marco integrado en Java 8 y posterior. Ver tutorial .Si no necesita la hora del día (horas, minutos, segundos, etc.), considere usar la
LocalDate
clase.fuente
LocalDateTime
es exactamente la clase incorrecta para usar para esto. No puede representar un momento ya que carece de cualquier concepto de zona horaria o desplazamiento de UTC. LlamarLocalDateTime.now
casi nunca tiene sentido. Úselo en suZonedDateTime
lugar. De lo contrario, está ignorando los problemas cruciales de la zona horaria. Por un lado, ¡algunas fechas en algunas zonas no comienzan a las 00:00!Aquí hay un par de funciones de utilidad que utilizo para hacer esto.
fuente
Una forma más de JAVA 8:
Pero es mucho más útil editar la fecha que ya existe.
fuente
LocalDateTime
no puede representar un momento, ya que carece de cualquier concepto de zona horaria o desplazamiento de UTC. LlamarLocalDateTime.now
casi nunca tiene sentido. Deberías estar usando en suZonedDateTime
lugar.Será mejor que establezca principalmente la zona horaria en el componente DateFormat de esta manera:
Luego, puede obtener el tiempo "00:00:00" pasando 0 milisegundos al formateador:
o puede crear un objeto Date:
o puede tener más posibilidades usando el componente Calendario, pero también debe establecer la zona horaria como GMT para la instancia del calendario:
fuente
tl; dr
java.time
Está utilizando terribles clases de fecha y hora antiguas que fueron suplantadas hace años por las clases modernas de java.time definidas en JSR 310.
Date
➙Instant
A
java.util.Date
representa un momento en UTC. Su reemplazo esInstant
. Llame a los nuevos métodos de conversión agregados a las clases antiguas.Zona horaria
Especifique la zona horaria en la que desea que tenga sentido su nueva hora del día.
Especificar un nombre de zona horaria correcta en el formato de
Continent/Region
, por ejemploAmerica/Montreal
,Africa/Casablanca
oPacific/Auckland
. Nunca use el 2-4 abreviatura de letras tales comoEST
oIST
, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).ZonedDateTime
Aplique el
ZoneId
alInstant
para obtener unZonedDateTime
. Mismo momento, mismo punto en la línea de tiempo, pero diferente hora del reloj de pared.Cambiar la hora del día
Pediste cambiar la hora del día. Aplique a
LocalTime
para cambiar todas las partes de la hora del día: hora, minuto, segundo, fracción de segundo. SeZonedDateTime
crea una instancia de un nuevo , con valores basados en el original. Las clases java.time utilizan este patrón de objetos inmutables para proporcionar seguridad para subprocesos .Primer momento del día
Pero pediste específicamente 00:00. Entonces, aparentemente, quieres el primer momento del día. Atención: algunos días en algunas zonas no comienzan a las 00:00:00. Es posible que comiencen a otra hora, como la 01:00:00, debido a anomalías como el horario de verano (DST).
Deje que java.time determine el primer momento. Extrae la parte de solo fecha. Luego pase la zona horaria para obtener el primer momento.
Ajustar a UTC
Si necesita volver a UTC, extraiga un archivo
Instant
.Instant
➙Date
Si necesita
java.util.Date
interoperar con un código antiguo que aún no se ha actualizado a java.time , convierta.fuente
Hacer esto podría ser más fácil (en Java 8)
fuente
Podemos establecer la parte de tiempo java.util.Date en 00:00:00 usando la clase LocalDate de Java 8 / Joda-datetime api :
fuente
Si necesita el formato 00:00:00 en una cadena, debe usar SimpleDateFormat como se muestra a continuación. Usando "H" en lugar de "h".
fuente
Otra forma de hacer esto sería usar un DateFormat sin segundos:
fuente
Puede hacer esto con lo siguiente:
fuente
Como Java8 agrega nuevas funciones de fecha, podemos hacerlo fácilmente.
fuente
LocalDateTime
no puede representar un momento, ya que carece de cualquier concepto de zona horaria o desplazamiento de UTC. LlamarLocalDateTime.now
casi nunca tiene sentido. Deberías estar usando en suZonedDateTime
lugar.