tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Europa / París]
Para generar una cadena en su formato deseado, pase un DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
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
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
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.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Si no le importa la hora del día ni la zona horaria, conviértalo a LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
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 un LocalDate
objeto para llamar a su atStartOfDay
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.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [América / Montreal]
UTC
Para ver ese momento a través de la lente de la zona horaria UTC , extraiga un Instant
objeto. Tanto el ZonedDateTime
como Instant
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.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Vemos las 5 de la mañana en lugar de la medianoche. En formato estándar, al Z
final es la abreviatura Zulu
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
, 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. Sin necesidad de cuerdas, sin necesidad dejava.sql.*
clases.
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
- Androide
- Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
- Para anteriormente Android (<26), el ThreeTenABP proyecto adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .
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 .