Conversión de fecha y hora a alguna otra zona horaria en java

He escrito este código para convertir la fecha y hora del sistema actual en alguna otra zona horaria. No recibo ningún error, pero no obtengo mi resultado como se esperaba. Me gusta si ejecuto mi progtwig en un momento determinado. Mi salida es ::

La hora actual en India es :: Fri Feb 24 16:09:23 IST 2012

La fecha y hora en :: Hora estándar central es :: Sat Feb 25 03:39:23 IST 2012

Y el tiempo real según la zona horaria CST es ::

 Friday, 24 February 4:39:16 am(GMT - 6:00) 

Entonces hay una brecha de tiempo . y no sé por qué está pasando esto. Cualquier ayuda será apreciada .. El código es ::

 package MyPackage; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class Temp2 { public static void main(String[] args) { try { Calendar currentdate = Calendar.getInstance(); String strdate = null; DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); strdate = formatter.format(currentdate.getTime()); TimeZone obj = TimeZone.getTimeZone("CST"); formatter.setTimeZone(obj); //System.out.println(strdate); //System.out.println(formatter.parse(strdate)); Date theResult = formatter.parse(strdate); System.out.println("The current time in India is :: " +currentdate.getTime()); System.out.println("The date and time in :: "+ obj.getDisplayName() + "is ::" + theResult); } catch (ParseException e) { e.printStackTrace(); } } } 

Está en la web. Podría haber buscado en Google De todos modos, aquí hay una versión para ti (descaradamente escogida y modificada a partir de aquí ):

 Calendar calendar = Calendar.getInstance(); TimeZone fromTimeZone = calendar.getTimeZone(); TimeZone toTimeZone = TimeZone.getTimeZone("CST"); calendar.setTimeZone(fromTimeZone); calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1); if (fromTimeZone.inDaylightTime(calendar.getTime())) { calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1); } calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset()); if (toTimeZone.inDaylightTime(calendar.getTime())) { calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings()); } System.out.println(calendar.getTime()); 

Tu error es llamar a parse lugar de format .

parse a parse para analizar una fecha de una cadena, pero en tu caso tienes una fecha y necesitas formatearla usando la zona horaria correcta.

Reemplaza tu código con

 Calendar currentdate = Calendar.getInstance(); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); TimeZone obj = TimeZone.getTimeZone("CST"); formatter.setTimeZone(obj); System.out.println("Local:: " +currentdate.getTime()); System.out.println("CST:: "+ formatter.format(currentdate.getTime()) 

y espero que obtengas el resultado que estás esperando.

Manejar las fechas en Java en mi trabajo diario es una tarea no trivial. Te sugiero que uses Joda-Time para simplificar nuestros días de encoding y no tienes que “reinventar la rueda”.

Pruebe algo como esto

 Date date = new Date(); String formatPattern = ....; SimpleDateFormat sdf = new SimpleDateFormat(formatPattern); TimeZone T1; TimeZone T2; // set the Calendar of sdf to timezone T1 sdf.setTimeZone(T1); System.out.println(sdf.format(date)); // set the Calendar of sdf to timezone T2 sdf.setTimeZone(T2); System.out.println(sdf.format(date)); // Use the 'calOfT2' instance-methods to get specific info // about the time-of-day for date 'date' in timezone T2. Calendar calOfT2 = sdf.getCalendar(); 

Puedes usar “CST6CDT” porque en algunos países siguen CDT en verano y CST en invierno

  public static String getDateInCST() { Calendar calendar = Calendar.getInstance(); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); formatter.setTimeZone(TimeZone.getTimeZone( "CST6CDT")); String strdate = formatter.format(calendar.getTime()); TimeZone.getAvailableIDs(); return strdate; } 

El problema es cuando imprime la fecha y llama al método toString y se imprimirá en la zona horaria predeterminada de la máquina. Pruebe este código y vea la diferencia.

 Calendar currentdate = Calendar.getInstance(); String strdate = null; DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ssz"); strdate = formatter.format(currentdate.getTime()); System.out.println("strdate=>" + strdate); TimeZone obj = TimeZone.getTimeZone("CST"); formatter.setTimeZone(obj); strdate = formatter.format(currentdate.getTime()); Date theResult = formatter.parse(strdate); System.out.println("The current time in India is :: " +currentdate.getTime()); System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + theResult); System.out.println("The date and time in :: " + obj.getDisplayName() + "is ::" + strdate);