Избегайте java.util.Date
Старые классы java.util.Date, .Calendar и SimpleDateFormat общеизвестно проблематичны. Избегайте их.
Среди многих проблем есть тот факт, что объект java.util.Date:
- Имеет часовой пояс глубоко внутри
- Игнорирует этот часовой пояс для большинства практических целей
- Имеет реализацию метода
toString
, которая применяет текущий часовой пояс JVM по умолчанию при генерации строкового представления своего внутреннего значения даты и времени UTC.
Так что наивному программисту объект Date, похоже, имеет часовой пояс, но на самом деле он всегда является UTC (только 64-битное целое число внутри, отсчет от эпох ).
Плохой формат
Формат вашей входной строки неуклюжий. В частности, использование двух цифр для года проблематично.
Если у вас есть контроль, я настоятельно рекомендую изменить его. Первый выбор - следовать стандартным форматам ISO 8601 .
Joda-Time & java.time
Используйте Joda-Time или новый пакет java.time, встроенный в Java 8 (и вдохновленный Joda-Time).
В отличие от java.util.Date, объект DateTime в Joda-Time четко понимает свой назначенный часовой пояс. Если вы опустите часовой пояс, будет назначен текущий часовой пояс JVM по умолчанию. Я рекомендую всегда указывать нужный часовой пояс.
Как Joda-Time, так и java.time по умолчанию используют форматы ISO 8601 как для генерации, так и для анализа строковых представлений значений даты и времени.
В Joda-Time 2.7…
String input = "271210 200157 UTC";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "ddMMyy HHmmss z" ).withZoneUTC();
DateTime dateTimeUtc = formatter.parseDateTime( input );
Легко настроить часовой пояс. Ради интереса, давайте переместим значение UTC в часовой пояс Квебека.
DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( Locale.CANADA_FRENCH ).print( dateTimeMontréal );
Дамп на консоль.
System.out.println( "input : " + input );
System.out.println( "dateTimeUtc : " + dateTimeUtc );
System.out.println( "dateTimeMontréal : " + dateTimeMontréal );
System.out.println( "output : " + output );
input : 271210 200157 UTC
dateTimeUtc : 2010-12-27T20:01:57.000Z
dateTimeMontréal : 2010-12-27T15:01:57.000-05:00
output : lundi 27 décembre 2010 15 h 01 EST