使用GWT创建ISO 8601日期字符串

时间:2017-11-27 12:32:06

标签: java gwt

这是我的代码:

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)

1 个答案:

答案 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);
//...