Создание GWT.create для класса TimeZoneConstants является плохой игрой в соответствии с GWT Javadoc [1]. Поэтому я создал класс на стороне сервера, который анализирует /com/google/gwt/i18n/client/constants/TimeZoneConstants.properties и создает кэш всех объектов JSON для каждого часового пояса (индексируется по их TZID Олсона) ).
Мой сайт работает на jboss, поэтому я скопировал TimeZoneConstants.properties в каталог war / WEB-INF / lib моего сайта (вероятно, его там не нужно было копировать, так как файлы GWT уже есть). Затем у меня есть одноэлементный класс, который выполняет анализ при построении:
InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(PROPERTIES_FILE);
InputStreamReader isr = new InputStreamReader(inStream);
BufferedReader br = new BufferedReader(isr);
for (String s; (s = br.readLine()) != null;) {
// using a regex to grab the id to use as a key to the hashmap
// a full json parser here would be overkill
Pattern pattern = Pattern.compile("^[A-Za-z]+ = (.*\"id\": \"([A-Za-z_/]+)\".*)$");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
String id = matcher.group(2);
String json = matcher.group(1);
if (!jsonMap.containsKey(id)) {
jsonMap.put(id, json);
}
}
}
br.close();
isr.close();
inStream.close();
Наконец, я делаю RPC-вызов, чтобы передать TimeZoneInfoJSON клиенту (при условии, что сервер знает, какой TimeZoneID мне интересен):
getTimeZone(new PortalAsyncCallback<String>() {
public void onSuccess(String tzJson) {
timeZone = TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(tzJson));
}
});
Не самое элегантное решение, но оно дало мне возможность отображать даты и время для определенного часового пояса через переходы DST.
[1] http://google -web-toolkit.googlecode.com / svn / javadoc / 2.0 / com / google / gwt / i18n / client / constants / TimeZoneConstants.html