Преобразование даты и времени в другой часовой пояс в java - PullRequest
8 голосов
/ 24 февраля 2012

Я написал этот код для преобразования текущей системной даты и времени в другой часовой пояс.Я не получаю никакой ошибки, но я не получаю вывод, как ожидалось.Например, если я выполню свою программу в определенное время. Мой вывод:

1002 * Текущее время в Индия равно :: Fri Feb 24 16:09:23 IST 2012

Дата и времяin :: Центральное стандартное время равно :: Sat Feb 25 03:39:23 IST 2012

А фактическое время по CST часового пояса равно ::

Friday, 24 February 4:39:16 a.m(GMT - 6:00)

Так что есть какой-то промежуток времени .и я не знаю, почему это происходит.Любая помощь будет оценена. Код:

1021 *

Ответы [ 5 ]

19 голосов
/ 24 февраля 2012

Это через Интернет.Мог бы гуглить.В любом случае, вот версия для вас (беззастенчиво выбрана и изменена с здесь ):

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());
8 голосов
/ 24 февраля 2012

Ваша ошибка - позвонить parse вместо format.

Вы вызываете parse для анализа даты из строки, но в вашем случае у вас есть дата, и вам нужно отформатировать ее, используя правильный часовой пояс.

Замените ваш код на

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

и я надеюсь, что вы получите ожидаемый результат.

4 голосов
/ 24 февраля 2012

Обработка дат в Java в моей повседневной работе - нетривиальная задача. Я предлагаю вам использовать Joda-Time , который упрощает наши дни кодирования, и вам не нужно «изобретать велосипед».

1 голос
/ 31 марта 2017

Вы можете просто использовать "CST6CDT" , потому что в некоторых странах они следуют CDT летом и CST зимой

 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;
     }
1 голос
/ 24 февраля 2012

Проблема в том, что когда вы печатаете дату, вызывается метод toString, и он печатает в часовом поясе вашего компьютера по умолчанию. Попробуйте этот код и увидите разницу.

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