tl; dr
LocalDate.of( 1985 , 1 , 1 )
…o…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Detalles
Las java.util.Date
, java.util.Calendar
y java.text.SimpleDateFormat
las clases se precipitó demasiado rápido cuando se lanzó por primera vez en Java y evolucionó. Las clases no fueron bien diseñadas o implementadas. Se intentaron mejoras, por lo tanto, las desvalorizaciones que ha encontrado. Lamentablemente, los intentos de mejora fracasaron en gran medida. Debes evitar estas clases por completo. Se suplantan en Java 8 por nuevas clases.
Problemas en tu código
Un java.util.Date tiene una porción de fecha y hora. Ignoraste la porción de tiempo en tu código. Por lo tanto, la clase Fecha tomará el comienzo del día según lo definido por la zona horaria predeterminada de su JVM y aplicará esa hora al objeto Fecha. Por lo tanto, los resultados de su código variarán según la máquina que ejecute o la zona horaria establecida. Probablemente no sea lo que quieres.
Si solo desea la fecha, sin la porción de tiempo, como para una fecha de nacimiento, es posible que no desee utilizar un Date
objeto. Es posible que desee almacenar solo una cadena de la fecha, en formato ISO 8601 de YYYY-MM-DD
. O use un LocalDate
objeto de Joda-Time (ver más abajo).
Joda-Time
Lo primero que debe aprender en Java: evite las clases java.util.Date y java.util.Calendar notoriamente problemáticas incluidas en Java.
Como se señaló correctamente en la respuesta del usuario3277382 , use Joda-Time o el nuevo paquete java.time. * En Java 8.
Código de ejemplo en Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Volcado a la consola ...
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Cuando corres ...
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
En este caso, el código para java.time es casi idéntico al de Joda-Time .
Obtenemos una zona horaria ( ZoneId
) y construimos un objeto de fecha y hora asignado a esa zona horaria ( ZonedDateTime
). Luego, utilizando el patrón de Objetos inmutables , creamos nuevas fechas y horas basadas en el mismo instante del objeto antiguo (recuento de nanosegundos desde la época ) pero con otra zona horaria asignada. Por último, obtenemos una LocalDate
que no tiene hora del día ni zona horaria, aunque tenga en cuenta que la zona horaria se aplica al determinar esa fecha (un nuevo día amanece antes en Oslo que en Nueva York, por ejemplo).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
Sobre java.time
El marco java.time está integrado en Java 8 y posterior. 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 .