Solución:
Este es el problema para empezar:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
Las abreviaturas de 3 letras deben evitarse por completo en favor de las ID de zona TZDB. EST es oriental Estándar Tiempo y Estándar el tiempo nunca observa el horario de verano; no es realmente un nombre de zona horaria completo. Es el nombre que se usa para parte de una zona horaria. (Desafortunadamente, no he encontrado un buen término para este concepto de “zona horaria media”).
Quieres un lleno nombre de la zona horaria. Por ejemplo, America/New_York
está en la zona horaria del este:
TimeZone zone = TimeZone.getTimeZone("America/New_York");
DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(zone);
System.out.println(format.format(new Date()));
Otras respuestas son correctas, especialmente la de Jon Skeet, pero desactualizadas.
java.time
Estas antiguas clases de fecha y hora han sido suplantadas por el marco java.time integrado en Java 8 y versiones posteriores.
Si simplemente desea la hora actual en UTC, use el Instant
clase.
Instant now = Instant.now();
EST
no es una zona horaria, como se explica en la Respuesta correcta de Jon Skeet. Estos códigos de 3-4 letras no están estandarizados ni son únicos, y aumentan la confusión sobre el horario de verano (DST). Utilice un nombre de zona horaria adecuado en el formato “continente / región”.
¿Quizás te refieres a la hora estándar del este en la costa este de América del Norte? ¿O la hora estándar de Egipto? ¿O la hora estándar europea?
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZoneId zoneId = ZoneId.of( "Africa/Cairo" );
ZoneId zoneId = ZoneId.of( "Europe/Lisbon" );
Utilice cualquiera de esos ZoneId
objeto para ajustar el momento actual a una zona horaria en particular para producir un ZonedDateTime
objeto.
ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;
Ajuste ese ZonedDateTime en una zona horaria diferente produciendo otro objeto ZonedDateTime desde el primero. El marco java.time utiliza objetos inmutables en lugar de cambiar (mutar) objetos existentes.
ZonedDateTime zdtGuam = zdt.withZoneSameInstant( ZoneId.of( "Pacific/Guam" ) ) ;
En lugar de ingresar “EST” para la zona horaria, puede ingresar “EST5EDT” como tal. Como señaló, simplemente “EDT” no funciona. Esto explicará el problema del horario de verano. La línea de código se ve así:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));