2016-11-02 3 views
2

Последнее воскресенье мы меняем время (-1h) в средней Европе. Но я делал некоторые тесты, и что-то не так с парсером java time. Это кодJava получает UTC + 2, если это будет UTC + 1

public static void main(String[] args) { 
    String dateFormatPattern = "yyyy-MM-dd HH:mm:ss"; 
    String dateUtc = "2016-10-09 12:50:00"; 

    SimpleDateFormat dateFormatUtc = new SimpleDateFormat(dateFormatPattern); 
    dateFormatUtc.setTimeZone(TimeZone.getTimeZone("UTC")); 

    SimpleDateFormat dateFormatLisboa = new SimpleDateFormat(dateFormatPattern); 
    dateFormatLisboa.setTimeZone(TimeZone.getTimeZone("Europe/Lisboa")); 

    SimpleDateFormat dateFormatMadrid = new SimpleDateFormat(dateFormatPattern); 
    dateFormatMadrid.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); 

    SimpleDateFormat dateFormatParis = new SimpleDateFormat(dateFormatPattern); 
    dateFormatParis.setTimeZone(TimeZone.getTimeZone("Europe/Paris")); 

    System.out.println("UTC: "+dateUtc); 
    try { 
     Date d = dateFormatUtc.parse(dateUtc); 
     System.out.println("Lisboa: "+dateFormatLisboa.format(d)); 
     System.out.println("Madrid: "+dateFormatMadrid.format(d)); 
     System.out.println("Paris: "+dateFormatParis.format(d)); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 

И это выход

UTC: 2016-10-09 12:50:00 
Lisboa: 2016-10-09 12:50:00 
Madrid: 2016-10-09 14:50:00 
Paris: 2016-10-09 14:50:00 

Почему разница между временем по Гринвичу и Мадридского время 2 часа? Сейчас в Мадриде есть UTC + 1.

Спасибо.

+1

Какая дата изменилась? Что произойдет, если вы выполните 'String dateUtc =" 2016-11-02 12:50:00 ";'? – Ash

+0

Спасибо, ты прав. Я был слеп с изменением времени, и я не понимал, что дата начала была раньше :( –

+0

Не стоит беспокоиться, ее классика, нуждающаяся в еще одной паре глаз, вещь. Я так решил, просто позвонив кому-нибудь посмотреть на вещи – Ash

ответ

4

Времена правильны, как часы изменены на 30 октября в 2 часа ночи

если вы измените вам код для этого

String dateUtc = "2016-11-09 12:50:00"; 

Вы получаете этот вывод, давая правильную разницу в 1 час.

UTC: 2016-11-09 12:50:00 
Lisboa: 2016-11-09 12:50:00 
Madrid: 2016-11-09 13:50:00 
Paris: 2016-11-09 13:50:00 

Часовой пояс связан с тем, когда объект даты фактически ссылается. Так что на этот раз это правильно

2

Принятый ответ французским является правильным. Значения перекрывали переход в летнее время (DST).

Я просто указываю, что ваш код использует старые классы времени, теперь устаревшие, вытесненные классами java.time.

Проанализируйте входное значение как LocalDateTime, потому что в нем отсутствуют индикаторы часового пояса или смещения от UTC.

Замените SPACE посередине на T, чтобы соответствовать стандарту ISO 8601, используемому по умолчанию в классах java.time для синтаксического анализа/генерации строк.

LocalDateTime ldt = LocalDateTime.parse("2016-10-09 12:50:00".replace(" " , "T")); 

Мы знаем из контекста бизнеса, что UTC предназначен для этой входной строки. Поэтому назначьте смещение UTC.

OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC); 

Adjust во временную зону путем применения ZoneId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of("Europe/Lisboa"); 
ZonedDateTime zdt = odt.atZoneSameInstant(z); 
+0

Я ценю ваш ответ, но приложение должно работать в java 7. Как вы объясните, у java 8 есть свежие библиотеки для работы с датами, справедливыми и необходимыми, aleluya! –

+1

@JonAnder Большая часть функциональности java.time портирована на Java 6 и 7 в проекте ThreeTen-Backport. –