Странная проблема с часовым поясом, календарем и SimpleDateFormat - PullRequest
7 голосов
/ 19 января 2010

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

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

Ответы [ 3 ]

9 голосов
/ 19 января 2010

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

6 голосов
/ 19 января 2010

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

    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"));
0 голосов
/ 19 января 2010

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

...