Преобразование времени в 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 утра.
Надеюсь это поможет..