Как (правильно) сообщить о часовом поясе, используя String.format% tz? - PullRequest
4 голосов
/ 31 марта 2009

Если я выполню:

System.out.println("Formatter: " + String.format("%1$tH:%1$tM:%1$tS %1$tz %1$tZ", now));
System.out.println("SimpleDF : " + new SimpleDateFormat("HH:mm:ss Z z").format(now));

Я ожидаю, что результат будет таким же. Если я отмечу автоматическую настройку на летнее время, значения начнут изменяться:

without dst (as expected, gmt=9:48):
Formatter: 10:48:16 +0100 GMT+01:00
SimpleDF : 10:48:16 +0100 GMT+01:00
with dst (gmt varies between formatter and sdf ???):
Formatter: 11:47:54 +0100 CEST
SimpleDF : 11:47:54 +0200 CEST

Запуск на Win XP, с теми же результатами на Java 1.6-10 / 13 и 1.5.0-14, локаль en_US. Как вы думаете, ошибка?

Возможно, связано: http://bugs.sun.com/view_bug.do?bug_id=6286592.

1 Ответ

1 голос
/ 01 апреля 2009

Правильный способ - использовать объект SimpleDateFormat (или, скорее, DateFormat). String.format предназначен для форматирования строк, возвращаемых в результате вызова метода toString() над переданным объектом. Первая строка кода может быть разбита на что-то вроде

String temp = now.toString();
System.out.println("Formatter: " + String.format("%1$tH:%1$tM:%1$tS %1$tz %1$tZ", temp));

Временный строковый объект отформатирован с использованием локали и настроек по умолчанию и, следовательно, может не гарантировать идеальный результат (по моему опыту).

SimpleDateFormat() работает над объектом Date, получает доступ к атрибутам и проверяет все исправления DST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...