我们存储的日期是以纪元为单位存储的,以及我们想要显示时间相关数据的对象的Olson时区ID。
如何将Olson TZID转换为TimeZoneConstant以创建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?还是有另一种方法可以做到这一点吗?
答案 0 :(得分:4)
根据GWT Javadoc [1],在TimeZoneConstants类上执行GWT.create是一个糟糕的游戏。所以我所做的是在服务器端创建一个类来解析/com/google/gwt/i18n/client/constants/TimeZoneConstants.properties并为每个时区构建所有JSON对象的缓存(由其Olson TZID索引) )。
我的网站在jboss上运行,因此我将TimeZoneConstants.properties复制到我网站的war / WEB-INF / lib目录中(可能不需要将其复制到那里,因为GWT jar已经存在)。然后我有一个单例类,在构造时进行解析:
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过渡期间显示特定时区的日期和时间的方法。