¿Cómo obtengo la hora actual en una zona horaria diferente en Java?
Pregunta
OK, me siento bastante tonto haciendo una pregunta tan básica, pero bueno.
Estoy tratando de obtener la hora actual en una zona horaria diferente en una aplicación web Java. He intentado la siguiente solución obvia: en mi servlet,
Calendar localCalendar = Calendar.getInstance (myBean.getTimeZone ());
luego paso el objeto de calendario a un JSP como un atributo de solicitud 'localCalendar':
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
pero mi salida parece ignorar el conjunto de zonas horarias, es decir,
Ahora es: [jue 26 de noviembre 10:01:03 GMT 2009] en TimeZone Indian / Mahe
Supongo que tiene algo que ver con la configuración regional, ¿hay alguna forma de formatear la hora para mi localidad, en otra zona horaria?
Solución
Los datos internos de Calendar
son básicamente:
Un instante en el tiempo puede ser representado por un valor de milisegundos que es un desplazamiento de la época, 1 de enero de 1970 00: 00: 00.000 GMT (gregoriano).
Por lo tanto, contiene un largo
que será el mismo sin importar las operaciones que use en él y toString
no hace promesas.
Desea formatear la fecha según la configuración regional y la zona horaria. Puede hacer esto en la capa de presentación (JSP) usando cosas como JSTL o puede formatear la fecha en su bean utilizando un DateFormat y devuelve el valor como una cadena.
Otros consejos
Si desea mostrar la fecha en un formato / zona horaria dada, use SimpleDateFormat
La respuesta de McDowell es correcta, pero el java.util.Calendar
(y Las clases java.util.Date
) están pasadas de moda.
java.time
El marco java.time está integrado en Java 8 y posterior, y se transfiere a Java 6 & amp; 7 y para Android. Estas nuevas clases suplantan a las antiguas clases de fecha y hora, ya que han demostrado ser pobremente diseñadas, confusas y problemáticas.
Un Instantáneo
es el momento actual en UTC.
Instant now = Instant.now();
Aplique una zona horaria ZoneId
para obtener un ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Zona horaria versus configuración regional
Tenga en cuenta que zona horaria y Locale
son problemas ortogonales. La zona horaria afecta la hora del reloj de pared , la desplazamiento de UTC . Locale
afecta solo a la presentación. La configuración regional se usa para (a) el lenguaje humano para el nombre del día y el mes, y (b) las normas culturales con respecto a cuestiones como el mes anterior al día del mes, la coma versus el período, etc.
Por ejemplo, puede tener un en francés Qu & # 233; b & # 233; cois usuario accediendo a su página mientras trabaja en India . Utilice una zona horaria de Asia / Kolkata
con un Locale.CANADA_FRENCH
.
Para generar una cadena formateada, use DateTimeFormatter
clase. Ya existen muchos ejemplos en Stack Overflow. Especifique el Locale
deseado / esperado a través de withLocale
método.