2011-05-22 22 views
29

estoy convirtiendo una hora UTC a otra zona horaria, usando este método:la conversión a otras zonas horarias UTC

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date parsed = format.parse("2011-03-01 15:10:37"); 
TimeZone tz = TimeZone.getTimeZone("America/Chicago"); 
format.setTimeZone(tz); 

String result = format.format(parsed); 

Así que la entrada es 2011-03-01 15:10:37 pero la salida de este (valor de resultado) es 2011-03-01 05:40:37. Si bien parece estar apagado, y de acuerdo con this link, debe ser 2011-03-01 09:10:37.

¿Qué estoy haciendo mal?

Respuesta

62

Resulta que el código era casi correcto, lo que no se tuvo en cuenta fue que al analizar la String para obtener un objeto Date inicialmente, se utiliza el sistema por defecto TimeZone, por lo que la fecha de origen no estaba en UTC como yo esperado.

El truco fue establecer la zona horaria al analizar la fecha en UTC y luego configurarla en el destino TimeZone. Algo como esto:

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date parsed = sourceFormat.parse("2011-03-01 15:10:37"); // => Date is in UTC now 

TimeZone tz = TimeZone.getTimeZone("America/Chicago"); 
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
destFormat.setTimeZone(tz); 

String result = destFormat.format(parsed); 
+2

No olvides 'try {} catch (ParseException e) {}' alrededor de 'sourceFormat.parse()'. Además, para obtener la zona horaria local en la que se encuentra el teléfono, utiliza 'TimeZone.getDefault()' para que puedas convertir el UTC a la zona horaria local –

+0

@hadi Eskandari Mate ¡me acabas de salvar! ¡Estaba arrancándome el pelo tratando de resolver este problema ...! Extraigo valores de nuestro servidor y los almacena en una base de datos antes de mostrarlos en la pantalla. Las fechas del servidor se almacenan en AEST (Australian Eastern Standard) y estaba teniendo su problema exacto en el que estaba usando la zona horaria predeterminada del sistema para interpretar el tiempo equivocado. Cuando intenté cambiar a otra fecha siempre estaba mal :) Solo necesitaba 'formater.setTimeZone (TimeZone.getTimeZone (RBApplication.adjustTimezoneAEST))' antes de mi línea de análisis. ¡Saludos, estaba en este problema por unas horas! – wired00

+0

@ wired00 Feliz de escuchar que ayuda mate :) –

2

Debe tener en cuenta el horario de verano. Lo hago resolviendo el desplazamiento (a partir de UTC) en milisegundos. Algo como esto debería funcionar.

int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(parsed) ? tz.getDSTSavings() : 0); 
String result = format.format(parsed.getTime() + currentOffsetFromUTC); 

inDayLightTime(...) El método devuelve un valor lógico y debe pasar un objeto Date con el fin para que decida si esa 'fecha' representa uno durante un periodo de horario de verano o no.

11

la conversión de una cadena de fecha del formato "2011-06-23T15: 11: 32" a la zona de tiempo de espera.

private String getDate(String dateString) { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
    Date value = null; 
    try { 
     value = formatter.parse(dateString); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy hh:mmaa"); 
    dateFormatter.setTimeZone(TimeZone.getDefault()); 
    String dt = dateFormatter.format(value); 

    return dt; 
} 
1

Puede analizar el formato de fecha y la zona horaria de acuerdo con sus requisitos. Pruebe este fragmento de código, espero que sea útil para usted.

private String getFormattedDate(String OurDate) { 
    try { 
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // According to your Server TimeStamp 
     formatter.setTimeZone(TimeZone.getTimeZone("UTC")); //your Server Time Zone 
     Date value = formatter.parse(OurDate); // Parse your date 

     SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy"); //this format changeable according to your choice 
     dateFormatter.setTimeZone(TimeZone.getDefault()); 
     OurDate = dateFormatter.format(value); 

    } catch (Exception e) { 
     OurDate = "00-00-0000 00:00"; 

    } 
    return OurDate; 
} 
0

El siguiente código funciona bien para mí para cambiar la fecha de uno a otro. Considera el DayLightSaving también.

public static Calendar changeTimezoneOfDate(Date date, TimeZone fromTZ, TimeZone toTZ) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    long millis = calendar.getTimeInMillis(); 
    long fromOffset = fromTZ.getOffset(millis); 
    long toOffset = toTZ.getOffset(millis); 
    long convertedTime = millis - (fromOffset - toOffset); 
    Calendar c = Calendar.getInstance(); 
    c.setTimeInMillis(convertedTime); 
    return c; 
} 
Cuestiones relacionadas