Как заставить Java анализировать и форматировать дату / время с одним и тем же часовым поясом? Я продолжаю получать местный часовой пояс - PullRequest
0 голосов
/ 29 декабря 2010

Мое приложение хранит все даты Java в формате UTC. Разобрать их легко, но когда я их распечатываю, на дисплее отображается местный часовой пояс компьютера, и я хочу показать его как UTC.

Пример кода:

String sample = "271210 200157 UTC";
SimpleDateFormat dfmt = new SimpleDateFormat("ddMMyy HHmmss Z");
Date result = dfmt.parse(sample);
System.out.printf("%tc\n", result);

результат

Пн. 27 декабря 15:01:57 EST 2010

Что я хочу, это

Понедельник, 27 декабря 20:01:57 UTC 2010

Ясно, что я должен установить некоторые значения Locale и TimeZone, но я не вижу, где их разместить. Спасибо Пат

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

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

  dfmt.setTimeZone(timeZone);

Кроме того, вы не хотите печатать сам объект Date, но снова используете DateFormat

  String formattedDate = dfmt.format(result);
1 голос
/ 05 февраля 2015

Избегайте 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
...