Преобразование часовых поясов
Мне нужно преобразовать один часовой пояс в другой в моем проекте.
Я могу конвертировать из моего текущего часового пояса в другой, но не из другого часового пояса в другой.
Например, я нахожусь в Индии, и я могу конвертировать из Индии в США, используя 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 и более поздних версиях встроен пакет java.time. Этот пакет был вдохновлен Joda-Time. Хотя они имеют некоторое сходство и названия классов, они разные; у каждого есть функции, которых нет у другого. Одно заметное отличие заключается в том, что java.time избегает конструкторов, вместо этого использует статические методы создания экземпляров. Обе платформы возглавляет один и тот же человек, Стивен Колборн.
Большая часть функций java.time была перенесена обратно на Java 6 и 7 в рамках проекта ThreeTen-Backport. Дополнительно адаптировано для Android в проекте ThreeTenABP.
В случае с этим вопросом они работают таким же образом. Укажите часовой пояс и вызовите now
метод, чтобы получить текущий момент, затем создайте новый экземпляр на основе старого неизменяемого экземпляра для настройки на часовой пояс.
Обратите внимание на два разных класса часовых поясов. Один - это именованный часовой пояс, включающий все правила перехода на летнее время и другие подобные аномалии плюс смещение от UTC, а другой - это только смещение.
ZoneId zoneMontréal = ZoneId.of("America/Montreal");
ZonedDateTime nowMontréal = ZonedDateTime.now ( zoneMontréal );
ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant( zoneTokyo );
ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant( ZoneOffset.UTC );
Joda-Time
Ниже приведен некоторый пример кода в Joda-Time 2.3. Найдите в StackOveflow еще много примеров и подробных обсуждений.
DateTimeZone timeZoneLondon = DateTimeZone.forID( "Europe/London" );
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime nowLondon = DateTime.now( timeZoneLondon ); // Assign a time zone rather than rely on implicit default time zone.
DateTime nowKolkata = nowLondon.withZone( timeZoneKolkata );
DateTime nowNewYork = nowLondon.withZone( timeZoneNewYork );
DateTime nowUtc = nowLondon.withZone( DateTimeZone.UTC ); // Built-in constant for UTC.
У нас есть четыре представления одного и того же момента на временной шкале Вселенной.
†На самом деле у java.util.Date
класса действительно есть часовой пояс, скрытый в его исходном коде. Но класс игнорирует этот часовой пояс для большинства практических целей. Итак, в качестве сокращения, часто говорят, что j.u.Date не имеет назначенного часового пояса. Сбивает с толку? ДА. Избегайте беспорядка, связанного с JODA.u.Date, и используйте Joda-Time и / или java.time.
Ответ 2
Несколько примеров
Преобразование времени между часовыми поясами
Преобразование времени между часовыми поясами
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class TimeZoneExample {
public static void main(String[] args) {
// Create a calendar object and set it time based on the local
// time zone
Calendar localTime = Calendar.getInstance();
localTime.set(Calendar.HOUR, 17);
localTime.set(Calendar.MINUTE, 15);
localTime.set(Calendar.SECOND, 20);
int hour = localTime.get(Calendar.HOUR);
int minute = localTime.get(Calendar.MINUTE);
int second = localTime.get(Calendar.SECOND);
// Print the local time
System.out.printf("Local time : %02d:%02d:%02d\n", hour, minute, second);
// Create a calendar object for representing a Germany time zone. Then we
// wet the time of the calendar with the value of the local time
Calendar germanyTime = new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin"));
germanyTime.setTimeInMillis(localTime.getTimeInMillis());
hour = germanyTime.get(Calendar.HOUR);
minute = germanyTime.get(Calendar.MINUTE);
second = germanyTime.get(Calendar.SECOND);
// Print the local time in Germany time zone
System.out.printf("Germany time: %02d:%02d:%02d\n", hour, minute, second);
}
}
Ответ 3
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();
Ответ 4
Часового пояса "по умолчанию" можно полностью избежать, просто установив часовой пояс соответствующим образом для Calendar
объекта. Однако я бы лично посоветовал вам использовать Joda Time как гораздо более совершенный API для операций с датой и временем в Java. Помимо всего прочего, преобразование часовых поясов в Joda выполняется очень просто.
Непонятно, как выглядит ваш текущий код и почему вы можете конвертировать только через часовой пояс по умолчанию, но в Joda Time вы бы просто указали часовой пояс явно при создании (скажем) DateTime
объекта, а затем использовали withZone(DateTimeZone zone)
.
Если бы вы могли рассказать нам подробнее о том, как вы получаете входные данные, мы могли бы привести более полный пример.