Преобразование времени в Java без использования Joda Time

Мой основной запрос - преобразование времени в определенном месте в соответствующее время в другом месте. Например, сколько времени в Лос-Анджелесе, когда в Индии 23:30? Сколько времени в Лос-Анджелесе, когда в Германии 10:00?

Входные данные, которые были даны, были целевым и относительным часовым поясом места и временем, которое будет преобразовано.

Например: ввод ["America/Los_angeles", "Германия", "23:00"]

Я пробовал различные подходы, такие как следующие:

1) Получение текущего времени в обоих часовых поясах, нахождение разницы и добавление разницы ко времени.

2) Используя приведенный ниже код:

String target_timezone = "America/Los_Angeles";
    String rel_timezone ="Germany";
     Calendar rel_calender = new GregorianCalendar(TimeZone.getTimeZone(rel_timezone));

     rel_calender.set(Calendar.HOUR, Integer.parseInt(arr[0]));
     rel_calender.set(Calendar.MINUTE, Integer.parseInt(arr[1]));
     rel_calender.set(Calendar.SECOND, 00);

     Calendar TargetTime = new GregorianCalendar(TimeZone.getTimeZone(target_timezone));
     TargetTime.setTimeInMillis(rel_calender.getTimeInMillis());
     SimpleDateFormat f = new SimpleDateFormat("EEEE,yyyy-MM-dd hh:mm a Z");
     System.out.println("time in  " + target_timezone + "when it is 17:00 in " + rel_timezone + ": " );
     System.out.println((TargetTime.get(Calendar.DST_OFFSET)));
     System.out.print((TargetTime.get(Calendar.HOUR)));
     System.out.print(":" +(TargetTime.get(Calendar.MINUTE)));
     System.out.println(":" +(TargetTime.get(Calendar.SECOND)));
     System.out.println((TargetTime.get(Calendar.YEAR)));

Год получился неправильным.

Есть лучший способ сделать это? Я пробовал различные методы Calendar, SimpleDateFormat и Date. Я могу использовать только базовые утилиты Java, а не утилиты Joda. Заранее спасибо.

3 ответа

Решение

Используйте этот код:

     Calendar rel_calender = new GregorianCalendar();

     rel_calender.set(Calendar.HOUR_OF_DAY, 17);
     rel_calender.set(Calendar.MINUTE, 00);
     rel_calender.set(Calendar.SECOND, 00);
     rel_calender.get(Calendar.HOUR);

     rel_calender.setTimeZone(TimeZone.getTimeZone(rel_timezone));

Если вы используете свой код, час rel_calendar будет установлен на 19 часов (17+2 смещение времени).

Вы спрашивали:

Сколько времени в Лос-Анджелесе, когда в Индии 23:30? Сколько времени в Лос-Анджелесе, когда в Германии 10:00?

Невозможно ответить на эти вопросы, как указано. В то время как Индия использует UTC+05:30 круглый год, Лос-Анджелес колеблется между UTC-08:00 и UTC-07:00, а Germeny колеблется между UTC+01:00 и UTC+02:00. Эти изменения происходят в летнее время.

Кроме того, если вы вернетесь в историю, вы найдете много других изменений в этих часовых поясах. Так что даже озвученные мною смещения не всегда верны.

Есть только два способа выполнить такую ​​настройку:

  • Работайте только с часовыми поясами, которые никогда не меняли свое смещение, и таких очень мало, если вы просматриваете всю записанную историю.

  • Примените корректировку на конкретную дату. Например, вы можете преобразовать "сегодня" в Лос-Анджелесе в 23:30 в любой часовой пояс.

Лучший способ преобразовать время - вернуть их в UTC, применив смещение, а затем переключить их обратно на требуемое время, применив это смещение.

Пример:

09.11.2014, 12:00 - ИНДИЯ - Где смещение UTC для IST составляет +5:30. Вы хотели преобразовать в Центральное время (CST), где смещение UTC составляет -6:00.

Теперь получите 12:00 утра IST эквивалент UTC = 18:30 вечера UTC

Теперь добавьте смещение UTC CST к этому времени UTC, чтобы получить эквивалент CST 12:00AM IST.

Который 10/09/2014 12:30 утра.

Надеюсь это поможет..

Другие вопросы по тегам