Мне нужно преобразовать один часовой пояс в другой в моем проекте.
Я могу конвертировать из моего текущего часового пояса в другой, но не из другого часового пояса в другой.
Например, я нахожусь в Индии, и я могу конвертировать из Индии в США, используя Date d=new Date(); и присвоив его объекту календаря и установив часовой пояс.
Однако я не могу сделать это из другого часового пояса в другой часовой пояс. Например, я нахожусь в Индии, но у меня возникли проблемы с преобразованием часовых поясов из США в Великобританию.
Переведено автоматически
Ответ 1
tl;dr
ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" )) // Current moment in a particular time zone. .withZoneSameInstant( ZoneId.of( "Asia/Kolkata" )) // Same moment adjusted into another time zone.
Подробные сведения
Классу java.util.Date не назначен часовой пояс†, однако его toString реализация ошибочно применяет текущий часовой пояс JVM по умолчанию.
Избегайте java.util.Дата & .Календарь
Это одна из многих причин избегать заведомо неприятных java.util.Классы Date, .Calendar и SimpleDateFormat, поставляемые в комплекте с Java. Избегайте их. Вместо этого используйте либо:
Пакет java.time встроен в Java 8 и вдохновлен Joda-Time.
В Java 8 и более поздних версиях встроен пакет java.time. Этот пакет был вдохновлен Joda-Time. Хотя они имеют некоторое сходство и названия классов, они разные; у каждого есть функции, которых нет у другого. Одно заметное отличие заключается в том, что java.time избегает конструкторов, вместо этого использует статические методы создания экземпляров. Обе платформы возглавляет один и тот же человек, Стивен Колборн.
Большая часть функций java.time была перенесена обратно на Java 6 и 7 в рамках проекта ThreeTen-Backport. Дополнительно адаптировано для Android в проекте ThreeTenABP.
В случае с этим вопросом они работают таким же образом. Укажите часовой пояс и вызовите now метод, чтобы получить текущий момент, затем создайте новый экземпляр на основе старого неизменяемого экземпляра для настройки на часовой пояс.
Обратите внимание на два разных класса часовых поясов. Один - это именованный часовой пояс, включающий все правила перехода на летнее время и другие подобные аномалии плюс смещение от UTC, а другой - это только смещение.
DateTimenowLondon= DateTime.now( timeZoneLondon ); // Assign a time zone rather than rely on implicit default time zone. DateTimenowKolkata= nowLondon.withZone( timeZoneKolkata ); DateTimenowNewYork= nowLondon.withZone( timeZoneNewYork ); DateTimenowUtc= nowLondon.withZone( DateTimeZone.UTC ); // Built-in constant for UTC.
У нас есть четыре представления одного и того же момента на временной шкале Вселенной.
†На самом деле у java.util.Date класса действительно есть часовой пояс, скрытый в его исходном коде. Но класс игнорирует этот часовой пояс для большинства практических целей. Итак, в качестве сокращения, часто говорят, что j.u.Date не имеет назначенного часового пояса. Сбивает с толку? ДА. Избегайте беспорядка, связанного с JODA.u.Date, и используйте Joda-Time и / или java.time.
publicclassTimeZoneExample { publicstaticvoidmain(String[] args) { // Create a calendar object and set it time based on the local // time zone CalendarlocalTime= Calendar.getInstance(); localTime.set(Calendar.HOUR, 17); localTime.set(Calendar.MINUTE, 15); localTime.set(Calendar.SECOND, 20);
// 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. CalendarcalOfT2= sdf.getCalendar();
Ответ 4
Часового пояса "по умолчанию" можно полностью избежать, просто установив часовой пояс соответствующим образом для Calendar объекта. Однако я бы лично посоветовал вам использовать Joda Time как гораздо более совершенный API для операций с датой и временем в Java. Помимо всего прочего, преобразование часовых поясов в Joda выполняется очень просто.
Непонятно, как выглядит ваш текущий код и почему вы можете конвертировать только через часовой пояс по умолчанию, но в Joda Time вы бы просто указали часовой пояс явно при создании (скажем) DateTime объекта, а затем использовали withZone(DateTimeZone zone).
Если бы вы могли рассказать нам подробнее о том, как вы получаете входные данные, мы могли бы привести более полный пример.