Как получить дату в определенном часовом поясе? - PullRequest
0 голосов
/ 09 августа 2010

привет всем я использую следующий метод, чтобы получить текущее время в часовом поясе GMT ​​

public static Timestamp getCurrentTimeGMT() {

        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        long time = c.getTimeInMillis();
        long offset = TimeZone.getDefault().getOffset(time);
        return new Timestamp(time - offset);

    }

но когда я пытаюсь использовать тот же метод с небольшими изменениями, чтобы получить текущее время в GMT + 3 это дает мне тот же результат по Гринвичу? я не знаю почему:

public static Timestamp getCurrentTimeGMT3() {

    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"));
    long time = c.getTimeInMillis();
    long offset = TimeZone.getDefault().getOffset(time);
    return new Timestamp(time - offset);

}

есть идеи, почему приведенный выше код не работает должным образом, и как сделать такой метод?

Ответы [ 6 ]

4 голосов
/ 09 августа 2010

Timestamp расширяет Date - у него нет часового пояса, концептуально. Это просто момент времени.

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

(Как обычно, я бы рекомендовал использовать Joda Time вместо встроенного API, где это возможно. Это намного чище.)

2 голосов
/ 09 августа 2010

Что сказал Джон.Временная метка не имеет часового пояса, она всегда в формате UTC, и ее не следует использовать для представления местного времени.Если вам действительно нужны объекты для представления местного времени, Joda Time имеет класс для этого .

И вы должны знать, что «GMT + 3» не является действительным часовым поясом.Часовой пояс имеет не только базовое смещение, но также смещение летнего времени, которое может быть различным для часовых поясов с одинаковым базовым смещением и даже может изменяться для одного и того же часового пояса в соответствии с законодательством.Идентификатор зоны реального времени - «Европа / Берлин» или «Австралия / Дарвин».

2 голосов
/ 09 августа 2010

Почему вы вычитаете смещение из времени в последней строке?Это в основном сбрасывает ваше время обратно в GMT.Вы получаете GMT ​​+ 3, затем вычитаете 3 часа из этого.

0 голосов
/ 17 мая 2019

Пример кода для получения времени в другом часовом поясе

public class GetZoneDateTime {

public static void main(String[] args) throws Exception {
    String reqTzId = "Asia/Singapore";

    LocalDateTime now = LocalDateTime.now();
    System.out.println("Local Now: " + now + " TimeZone: " + TimeZone.getDefault());

    ZoneId zoneId = ZoneId.of(reqTzId);
    System.out.println("Req TimeZone : " + zoneId);

    LocalDateTime localNow = LocalDateTime.now(zoneId);
    System.out.println("tzLocalDateTime: " + localNow);

    ZonedDateTime zoneNow = ZonedDateTime.now(zoneId);
    System.out.println("tzZonedDateTime: " + zoneNow);
}

}

0 голосов
/ 24 марта 2017

Используйте статический метод Timezone.

TimeZone default = TimeZone.getDefault();

TimeZone.setDefault(TimeZone.getTimeZone("GMT+3"));
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(System.currentTimeMillis()));
Date date = cal.getTime(); // converted date time
System.out.println(date.toString());

// Set Back to System Default
TimeZone.setDefault(default);
0 голосов
/ 09 августа 2010

c.getTimeInMillis() возвращает количество миллисекунд с 1 января 1970 года в 0:00 UTC и возвращает одно и то же значение независимо от того, какой часовой пояс используется в экземпляре Calendar.

Если вы создаете календарь с часовым поясом и вам нужен доступ к полям времени, вы должны получить к ним прямой доступ:

int h = c.get(Calendar.HOUR_OF_DAY);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);
...