Conversão de data e hora para outro fuso horário em java

Eu escrevi este código para converter a data e a hora atuais do sistema para outro fuso horário. Eu não estou recebendo nenhum erro, mas eu não estou recebendo minha saída como esperado. Como se eu executasse meu programa em um determinado momento. Minha saída é:

A hora actual na Índia é: Fri Feb 24 16:09:23 IST 2012

A data e a hora em :: Hora Padrão Central é: Sat Feb 25 03:39:23 IST 2012

E o tempo real de acordo com o fuso horário da CST é:

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

Então, há algum intervalo de tempo . e eu não sei porque isso está acontecendo. Qualquer ajuda será apreciada .. O código é:

 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á na web. Poderia ter pesquisado. De qualquer forma, aqui está uma versão para você (descaradamente escolhida e modificada daqui ):

 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()); 

Seu erro é chamar a parse vez do format .

Você chama parse para analisar uma data de uma string, mas no seu caso você tem uma data e precisa formatá-la usando o fuso horário correto.

Substitua seu código por

 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()) 

e espero que você obtenha a saída que espera.

Lidar com datas em Java no meu trabalho diário é uma tarefa não trivial. Eu sugiro que você use o Joda-Time que simplifica nossos dias de codificação e você não precisa “reinventar a roda”.

Tente algo assim

 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(); 

Você pode simplesmente usar “CST6CDT” porque em alguns países eles seguem o CDT no verão e o CST no inverno

  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; } 

Problema é quando você imprime a data obj que chama o método toString e imprimirá em seu fuso horário padrão das máquinas. Experimente este código e veja a diferença.

 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);