Вопрос-ответ

Timezone conversion

Преобразование часовых поясов

Мне нужно преобразовать один часовой пояс в другой в моем проекте.

Я могу конвертировать из моего текущего часового пояса в другой, но не из другого часового пояса в другой.

Например, я нахожусь в Индии, и я могу конвертировать из Индии в США, используя 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).

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

2023-10-15 13:57 java