Вот ответ на 2017 год.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String inpt = "2011-03-23 16:40:44";
ZonedDateTime madridTime = LocalDateTime.parse(inpt, dtf)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.of("Europe/Madrid"));
System.out.println("GMT:\t\t" + inpt);
System.out.println("Europe/Madrid:\t" + madridTime.format(dtf));
Пожалуйста, оцените, насколько более естественно этот код выражает намерение.
Код печатается
GMT: 2011-03-23 16:40:44
Europe/Madrid: 2011-03-23 17:40:44
(сразмер вкладки 8 выравнивается хорошо, но StackOverflow, кажется, применяет размер вкладки 4).
Я поменял 23
и 03
в вашей входной строке, я полагаю, вы предполагали это.Кстати, это была не я, поймав вашу ошибку, это было LocalDateTime.parse()
, выдавшее исключение, потому что нет 23-го месяца.Также в этом отношении современные классы более полезны, чем устаревшие.
Joda-Time? Ответ Василия Бурка упоминает и рекомендует оба java.time
, которые яиспользую, и йода-тайм.Хотя Joda-Time уже является значительным улучшением по сравнению с устаревшими классами, используемыми в вопросе (SimpleDateFormat
, Calendar
, GregorianCalendar
), он уже находится в режиме обслуживания;дальнейшего развития не ожидается.java.time
очень вдохновлен Joda-Time.Для нового кода я не вижу причин, почему вы не должны предпочитать java.time
.