2011-07-18 15 views
5

Soy bastante nuevo en Java y estoy un poco atascado con el uso de SimpleDateFormat y Calendar. Tengo un Date-Object y quiero extraer una cadena de fechas GMT como yyyy-MM-dd HH:mm:ss. Vivo en Alemania y en este momento somos GMT +0200. La hora de mi Date-Object es, por ejemplo, 2011-07-18 13:00:00. Lo que necesito ahora es 2011-07-18 11:00:00. La compensación para mi zona horaria se debe calcular automáticamente.Convertir GMT DateTime String

he intentado algo como esto, pero supongo que hay un fallo en alguna parte:

private String toGmtString(Date date){ 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    TimeZone timeZone = TimeZone.getDefault(); 
    Calendar cal = Calendar.getInstance(new SimpleTimeZone(timeZone.getOffset(date.getTime()), "GMT")); 
    sd.setCalendar(cal); 
    return sd.format(date); 
} 

En algunos dispositivos del DateString se devuelve como yo quiero que haga. En otros dispositivos, el desplazamiento no se calcula a la derecha y recibo la fecha y la hora del objeto de fecha de entrada. ¿Me puede dar algunos consejos o consejos? Supongo que mi camino para obtener la zona horaria predeterminada no funciona.

Respuesta

5
private String toGmtString(Date date){ 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
    return sd.format(date); 
} 

que no es necesario crear una nueva SimpleTimeZone, porque no se está inventando una nueva zona horaria - hay 2 zonas horarias existentes que entran en juego en su programa, GMT y el que viene por defecto.

Tampoco necesita modificar su objeto de fecha existente, porque no desea representar un punto diferente en el tiempo; solo desea una forma diferente de mostrar el mismo punto en el tiempo.

Todo lo que tienes que hacer es indicarle a SimpleDateFormat qué zona horaria usar en el formateo.

+0

No puedo creer que sea tan fácil, pero por supuesto intentaré eso también. Dame unos minutos por favor ... – Marco

+0

Ok ... Probado ... Usé un objeto de fecha que representa '2011-07-18 13: 34: 27'. Usando la función de fecha predeterminada '.toGMTString()' Recibo '18 Jul 2011 11:43:27 GMT' que es el punto exacto en el tiempo que necesito. Usando mi propia función todavía recibo' 2011-07-18 13: 43: 27' que fue mi problema. Usando la función de Jigar Joshin recibo '2011-07-18 12: 43: 27' que falta 1 hora (verano europeo). Usando la función de Eli Acherkans recibo '2011-07-18 11: 43: 27' que es exactamente lo que quería (Offset incluyendo verano europeo). – Marco

+0

+1

2
private String toGmtString(Date date){ 
    //date formatter 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    //getting default timeZone 
    TimeZone timeZone = TimeZone.getDefault(); 
    //getting current time 
    Calendar cal = Calendar.getInstance() 
    cal.setTime(date) ; 
    //adding/substracting curren't timezone's offset 
    cal.add(Calendar.MILLISECOND, -1 * timeZone.getRawOffset());  
    //formatting and returning string of date 
    return sd.format(cal.getTime()); 
} 
+0

Ok, esto se ve bien. Lo probaré en unos minutos. Una pregunta. ¿Dónde y cómo usaste el parámetro de fecha de la llamada de función? ¿Debo usar 'cal.setTime (date);' después de obtener la instancia? – Marco

+0

sí exactamente. actualizado. –

+0

¡Agradable! ¡Trabajos! ¡Muchas gracias! – Marco