Конвертировать идентификатор часового пояса Олсона в TimeZoneConstant в GWT (на стороне клиента) - PullRequest
4 голосов
/ 16 декабря 2011

Мы храним наши даты, которые хранятся в миллисекундах с начала эпохи и идентификатора часового пояса Олсона для объектов, о которых мы хотим отобразить данные, связанные со временем.

Как преобразовать TZID Олсона в TimeZoneConstant для созданияa TimeZone и использовать DateTimeFormat?

// values from database
String tzid = "America/Vancouver";
long date = 1310771967000L;


final TimeZoneConstants tzc = GWT.create(TimeZoneConstants.class);
String tzInfoJSON = MAGIC_FUNCTION(tzid, tzc);
TimeZone tz = TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(tzInfoJSON));
String toDisplay = DateTimeFormat.getFormat("y/M/d h:m:s a v").format(new Date(date), tz); 

Существует ли этот MAGIC_FUNCTION?Или есть другой способ сделать это?

1 Ответ

4 голосов
/ 02 февраля 2012

Создание 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

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