这是我的代码:
public static String getStringFormat(Date inputDate, String timeZone){
String strFormat = null;
try{
final TimeZone computedTimeZone = TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(timeZone));
DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.ISO_8601);
strFormat = dateTimeFormat.format(inputDate, computedTimeZone);
Date d = new Date(strFormat);
strFormat = dateTimeFormat.format(d, TimeZone.createTimeZone(0));
String[] s = strFormat.split("\\+");
strFormat = s[0];
}catch(Exception e){
Console.log(e.getMessage());
}
return strFormat;
}
对于输入,new Date()
和Etc/GMT+3
此函数返回null。可能有什么不对?
错误
Error: NullPointerException: undefined
at NBF_g$.QBF_g$ [as createError_0_g$] (NullPointerException.java:40)
at NBF_g$.ub_g$ [as initializeBackingError_0_g$] (Throwable.java:113)
at NBF_g$.bb_g$ (Throwable.java:61)
at NBF_g$.Ib_g$ (Exception.java:25)
at NBF_g$.avq_g$ (RuntimeException.java:25)
at NBF_g$.gfs_g$ (JsException.java:34)
at new NBF_g$ (NullPointerException.java:27)
at new wou_g$ (JSONString.java:43)
答案 0 :(得分:1)
方法TimeZoneInfo.buildTimeZoneData(String tzJSON)
不接受区域的名称,但需要一个JSON字符串,其中包含该区域工作方式的详细信息。事实证明,浏览器并没有告诉您所有时区的所有细节,因此您的应用必须已经准备好处理它们。
GWT附带所有时区(虽然它们目前有点过时,应该在下一个版本中更新),但你必须告诉编译器你想要哪些,否则它会将它们编译出来。所有可能的时区及其偏移等的完整列表并不小,所以我建议您限制列表。
这些存储在常量接口TimeZoneConstants
中。以下是您可以使用它的方法:
TimeZoneConstants constants = GWT.create(TimeZoneConstants.class);
// This is the shorthand for TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(...))
TimeZone computedTimeZone = TimeZone.createTimeZone(constants.americaAdak());
//...
如果您想使用时区字符串,比方说,从服务器传递,您可以构建一个支持的可能时区的映射。请注意,完整的地图非常大(200KB仅适用于“America / ...”组中的时区)。
computedTimeZone = TimeZone.createTimeZone(constants.americaAdak());
zones.put(computedTimeZone.getID(), computedTimeZone);
computedTimeZone = TimeZone.createTimeZone(constants.americaAnchorage());
zones.put(computedTimeZone.getID(), computedTimeZone);
computedTimeZone = TimeZone.createTimeZone(constants.americaAnguilla());
zones.put(computedTimeZone.getID(), computedTimeZone);
//...
然后,您可以根据需要从地图中读出特定项目:
String tzName = Window.prompt("Enter a timezone name", "America/Chicago");
DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.ISO_8601);
String strFormat = dateTimeFormat.format(inputDate, zones.get(tzName));
//...
在你的评论中,你澄清了一个问题,你只需要处理偏移,而不是完整的TimeZone字符串格式,即Etc/GMT+3
,意思是“偏离GMT +3小时”。这更容易处理 - 只需将+3
解析为数字,然后使用TimeZone.createTimeZone(int timeZoneOffsetInMinutes)
方法。这将不了解夏令时,但如果没有时区的全名或偏移列表等(这就是为什么JSON如此之大),这是不可能的。
//TODO, implement parse(), don't forget about negative numbers
int offsetInHours = parse(timeZone);
TimeZone computedTimeZone = TimeZone.createTimeZone(60 * offsetInHours);
//...