Странная проблема с часовым поясом, календарем и SimpleDateFormat

StackOverflow https://stackoverflow.com/questions/2092340

Вопрос

Давайте рассмотрим следующий код:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US);
long start = sdf.parse("10:30:00 30/09/2009").getTime();
long end = sdf.parse("10:30:00 30/10/2009").getTime();

Calendar c = Calendar.getInstance(Locale.US);
c.setTimeInMillis(start);
System.out.println("Start = " + c.getTime());
c.setTimeInMillis(end);
System.out.println("  End = " + c.getTime());

При запуске этого фрагмента кода я получаю следующий результат:

Start = Wed Sep 30 10:30:00 CEST 2009
  End = Fri Oct 30 10:30:00 CET 2009

Почему у меня другой часовой пояс?

Обратите внимание: если я установлю первую дату в августе, а вторую в сентябре, в обоих случаях выходные данные будут отображать один и тот же часовой пояс:

long start = sdf.parse("10:30:00 30/08/2009").getTime();
long end = sdf.parse("10:30:00 30/09/2009").getTime();

отобразит:

Start = Sun Aug 30 10:30:00 CEST 2009
  End = Wed Sep 30 10:30:00 CEST 2009

Я использую Java 1.6.0_14

Это было полезно?

Решение

CEST это центральноевропейское летнее время.Это то же самое, что CET с вступлением в силу летнего времени.

Другие советы

Вы можете установить часовой пояс по умолчанию

    import java.util.TimeZone;
...        
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));  // or "Etc/GMT-1"

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US);
    long start = sdf.parse("10:30:00 30/09/2009").getTime();
    long end = sdf.parse("10:30:00 30/10/2009").getTime();

    Calendar c = Calendar.getInstance(Locale.US);
    c.setTimeInMillis(start);
    System.out.println("Start = " + c.getTime());
    c.setTimeInMillis(end);
    System.out.println("  End = " + c.getTime());

использовать TimeZone.getAvailableIDs() чтобы увидеть все доступные идентификаторы.

РЕДАКТИРОВАТЬ:вы также можете использовать новый SimpleTimeZone

    TimeZone.setDefault(new SimpleTimeZone(60 * 60 * 1000, "CET"));

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top