Tengo un objeto Fecha de Java que contiene información de fecha y hora. Quiero escribir un método que corte la información de tiempo, trunca las horas-minutos-segundos, por lo que solo me queda la fecha.
Entrada de ejemplo:
2008-01-01 13:15:00
Rendimiento esperado:
2008-01-01 00:00:00
¿Tienes un consejo? Intenté hacer algo como esto:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
pero tuve problemas con la zona horaria.
java.util.Calendar
ahora son heredadas , suplantadas por las clases java.time . Consulte el tutorial de Oracle .¿Ha mirado el método de truncar DateUtils en Apache Commons Lang?
eliminará el elemento de tiempo.
fuente
¿Has mirado a Joda ? Es una forma mucho más fácil e intuitiva de trabajar con fechas y horas. Por ejemplo, puede convertir trivialmente entre (digamos) objetos LocalDateTime y LocalDate .
p. ej. (para ilustrar la API)
Además, resuelve algunos problemas de seguridad de subprocesos con formateadores de fecha / hora y se recomienda encarecidamente para trabajar con cualquier problema de fecha / hora en Java.
fuente
Solo una actualización rápida a la luz de las clases java.time ahora integradas en Java 8 y posteriores.
LocalDateTime
tiene untruncatedTo
método que aborda de manera efectiva lo que está hablando aquí:Esto expresará la hora actual en minutos solamente:
Puede usar un
ChronoUnit
(oTemporalUnit
) menor que DAYS para ejecutar el truncamiento (ya que el truncamiento se aplica solo a la parte de tiempo de LocalDateTime, no a la parte de fecha).fuente
fuente
Con Joda puedes conseguir fácilmente la fecha esperada.
A partir de la versión 2.7 (tal vez desde alguna versión anterior superior a 2.2), como señala un comentarista,
toDateMidnight
se ha desaprobado a favor o con el nombre apropiadowithTimeAtStartOfDay()
, lo que hace que sea convenienteposible.
Beneficio agregado de una API mucho más agradable.
Con versiones anteriores, puede hacer
fuente
withTimeAtStartOfDay
.toLocalDate
para obtener un objeto que ni siquiera tiene un componente de tiempo.Hice el truncamiento con la nueva API java8. Me enfrenté a una cosa extraña pero en general es truncada ...
fuente
Use DateUtils de Apache, con truncar, así:
fuente
Para marcas de tiempo:
fuente
Desde java.util.Date JavaDocs:
y desde java.sql.Date JavaDocs:
Entonces, el mejor enfoque es usar java.sql.Date si no necesita la parte de tiempo
y la salida es:
fuente
tl; dr
Para generar una cadena en su formato deseado, pase un
DateTimeFormatter
.Detalles
Otras respuestas son correctas, pero usan clases de fecha y hora antiguas ahora obsoletas por el marco java.time.
java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Gran parte de la funcionalidad de java.time se ha actualizado a Java 6 y 7 ( ThreeTen-Backport ) y se ha adaptado aún más a Android ( ThreeTenABP ).
Primero, modifique la cadena de entrada para cumplir con la versión canónica del formato ISO 8601. Los formatos estándar ISO 8601 se utilizan de forma predeterminada en las clases java.time para analizar / generar cadenas que representan valores de fecha y hora. Necesitamos reemplazar ese ESPACIO en el medio con un
T
.Ahora podemos analizarlo como un
LocalDateTime
, donde "Local" significa que no hay una localidad específica. La entrada carece de información de compensación de UTC o de zona horaria.Si no le importa la hora del día ni la zona horaria, conviértalo a
LocalDate
.Primer momento del día
Si, en cambio, desea que la hora del día se establezca en el primer momento del día, use una
ZonedDateTime
clase y luego conviértala en unLocalDate
objeto para llamar a suatStartOfDay
método. Tenga en cuenta que el primer momento puede no ser el momento00:00:00
debido al horario de verano o quizás a otras anomalías.La zona horaria es crucial porque en un momento dado la fecha varía en todo el mundo por zona. Por ejemplo, unos momentos después de la medianoche en París es un nuevo día para los parisinos, pero sigue siendo “ayer” en Montreal para los canadienses.
UTC
Para ver ese momento a través de la lente de la zona horaria UTC , extraiga un
Instant
objeto. Tanto elZonedDateTime
comoInstant
representarán el mismo momento en la línea de tiempo, pero aparecerán como dos tiempos de reloj de pared diferentes .An
Instant
es la clase básica de bloques de construcción en java.time, siempre en UTC por definición. Use esta clase con frecuencia, ya que generalmente debería realizar su lógica comercial, almacenamiento de datos e intercambio de datos en UTC.Vemos las 5 de la mañana en lugar de la medianoche. En formato estándar, al
Z
final es la abreviaturaZulu
y significa "UTC".Acerca de 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. Sin necesidad de cuerdas, sin 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
Utilice el método de la clase Calendar
set()
para establecer los camposHOUR_OF_DAY, MINUTE, SECOND
yMILLISECOND
en cero.fuente
La pregunta es contradictoria. Solicita una fecha sin una hora del día, pero muestra un ejemplo con una hora de
00:00:00
.Joda-Time
ACTUALIZACIÓN: El proyecto Joda-Time está ahora en modo de mantenimiento , y el equipo aconseja la migración a las clases java.time . Vea mi otra respuesta para la solución java.time.
Si, en cambio, desea que la hora del día se establezca en el primer momento del día, use un
DateTime
objeto en la biblioteca Joda-Time y llame a suwithTimeAtStartOfDay
método. Tenga en cuenta que el primer momento puede no ser el momento00:00:00
debido al horario de verano o quizás a otras anomalías.fuente
Solo
clear()
campos redundantes.Desde Java 8, una mejor opción es usar el
truncatedTo
método deLocalDateTime
, por ejemplo:fuente
calendar.clear(Calendar.HOUR_OF_DAY);
no despeja las horas. La solución de @cletus funciona bien.Realmente me molestó que el nuevo constructor de calendario "mejorado" no tome un int durante milisegundos como el "horrible" antiguo Date one. Entonces me enojé mucho y escribí esto:
No usé la palabra "cosas" en ese momento, pero luego descubrí la felicidad de esto:
Pero todavía estoy bastante enojado por eso.
fuente
Solucioné el problema de esta manera (en la zona ocho del este (hora de Beijing)):
En primer lugar, debe tener claro qué es la marca de tiempo. La marca de tiempo es el total de milisegundos desde el 01 de enero a las 00:00:00 1970 de GMT (igual que UTC) o el jueves 01 de enero a las 08:00:00 CST de 1970 hasta ahora.
Recuerde: la marca de tiempo es independiente de la zona horaria.
Entonces obtienes el mismo resultado con la siguiente declaración en diferentes zonas horarias:
Y
imprime información horaria diferente en diferentes zonas horarias: si configura la zona horaria de su PC como UTC, obtendrá
Pero si configura la zona horaria como (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq, obtiene:
Java obtiene la marca de tiempo, luego muestra la información de fecha y hora de acuerdo con la zona horaria.
Para la introducción de cómo Java muestra la información de fecha y hora en diferentes zonas horarias, la forma de transferir la información de tiempo es fácil. Debe obtener la marca de tiempo y tener en cuenta la zona horaria cuando corte la información de tiempo. Luego, puede crear un nuevo objeto de fecha con el sello de tiempo de corte (podemos llamarlo sello de fecha), Java compensará la zona horaria cuando muestre la información de la fecha.
Al igual que en la zona este de ocho (hora de Pekín), la hora de Pekín es 8 horas antes que GMT, por lo que debe restar más 8 horas cuando realice la operación de módulo. Es decir, primero debe obtener la hora GMT, luego Java agregará 8 horas cuando se muestre el tiempo según la configuración de la zona horaria de su PC.
El problema de la zona horaria es oscuro y también me desconcierta durante mucho tiempo. Ahora lo dejo claro. La esperanza ayuda.
2018-01-04 El método siguiente también funciona.
}
fuente
Puede hacer esto para evitar problemas de zona horaria:
Aunque el
Date
objeto Java es un valor de marca de tiempo, pero durante el truncado, se convertirá a la zona horaria local, por lo que obtendrá un valor sorprendente si espera un valor de la zona horaria UTC.fuente
Calendar
yDate
se volvieron heredadas hace años con las clases java.time que implementan JSR 310 en Java 8 y versiones posteriores. Sugerir su uso en 2018 es un mal consejo.Puede ser una respuesta tardía, pero aquí hay una forma de hacerlo en una línea sin usar ninguna biblioteca:
fuente
Con Joda-Time desde la versión 2.0 puede usar
LocalDate.toDate()
.Simplemente
fuente
a Java Date object
lo que uséjava.util.Date
. Además, no explica cómo su zona horaria es problemática con java.util.Date (¿cuándo? ¿Dónde?) Aunque no puede evitar usar otro que no seaDate
.Para todas las respuestas que usan Calendario, debe usarlo así en su lugar
Pero yo prefiero esto:
fuente
java.sql.Date
clase pretende representar un valor de solo fecha, pero en realidad tiene una hora del día ajustada para la zona horaria UTC. Así que no es realmente una solución adecuada a la Pregunta.Aquí hay una forma sencilla de obtener la fecha sin la hora si está utilizando Java 8+: Utilice el tipo java.time.LocalDate en lugar de Date.
La salida:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
fuente
LocalDate
es una buena idea para la mayoría de los propósitos, pero no está claro cómo funcionará con la entrada de la pregunta2008-01-01 13:15:00
.