Java 在GWT中显示本地时间

Java 在GWT中显示本地时间,java,date,datetime,gwt,Java,Date,Datetime,Gwt,我有一个应用程序,我需要在当地时间显示事件,不是在用户的时区,而是在事件发生的时区。我得到的是ISO-8601格式的时间,包括时区偏移。时区不是恒定的,我显示的每个事件都可能有不同的时区(它们代表航班起飞和到达时间) 例如,我有“2014-02-05T09:00-08:00”,我想将其显示为“9:00am” 我的第一个天真的代码如下所示: private static final DateTimeFormat ISO_TIME_FORMAT = DateTimeFormat.getFor

我有一个应用程序,我需要在当地时间显示事件,不是在用户的时区,而是在事件发生的时区。我得到的是ISO-8601格式的时间,包括时区偏移。时区不是恒定的,我显示的每个事件都可能有不同的时区(它们代表航班起飞和到达时间)

例如,我有“2014-02-05T09:00-08:00”,我想将其显示为“9:00am”

我的第一个天真的代码如下所示:

private static final DateTimeFormat ISO_TIME_FORMAT =
    DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mmZZZ");
private static final DateTimeFormat TIME_OF_DAY_FORMAT =
    DateTimeFormat.getFormat(PredefinedFormat.HOUR_MINUTE);

public static String formatTimeOfDay(String iso8601Time) {
  return TIME_OF_DAY_FORMAT.format(QPX_TIME_FORMAT.parse(iso8601Time));
}
但这显示了用户时区中的时间,在我的例子中是“6:00am”,因为我在美国东部时间

查看GWT参考,看起来我需要根据ISO-8601日期获得正确的时区,但我不清楚如何做到这一点。我试过了

public static String formatTimeOfDay(String isoTime) {
  Date date = QPX_TIME_FORMAT.parse(isoTime);
  String tzoneStr = qpxTime.substring(16);
  TimeZone tzone = TimeZone.createTimeZone(tzoneStr);
  return TIME_OF_DAY_FORMAT.format(date, tzone);
}
但我得到了一个“错误解析JSON:SyntaxError:Unexpected number-05:00”异常。似乎我应该能够从输入字符串中解析日期和时区,因为它包含所有编码的信息

在这一点上,似乎最简单的事情就是通过isoTime.substring(11,16)直接从输入时间中提取一天中的时间。这意味着我必须编写一个自定义解析器来将24小时格式转换为am/pm格式,但这可能是最简单的


有其他建议吗?

在GWT 2.5.1 TimeZone中。createTimeZone获取的JSON版本(此JSON版本可在中找到)。为了从“-08:00”区域偏移量创建JSON版本,您必须自己解析它。但即使有适当的时区,它仍然不适合我:

DateTimeFormat ISO_TIME_FORMAT = DateTimeFormat.getFormat ("yyyy-MM-dd'T'HH:mmZZZ");
DateTimeFormat TIME_OF_DAY_FORMAT = DateTimeFormat.getFormat (PredefinedFormat.HOUR_MINUTE);
String qpxTime = "2014-02-05T09:00-08:00";
RootPanel.get().add (new Label ("dts: " + qpxTime));
Date dt = ISO_TIME_FORMAT.parse (qpxTime);
RootPanel.get().add (new Label ("dt: " + dt.toString()));
String tzs = qpxTime.substring (16);
RootPanel.get().add (new Label ("tzs: " + tzs));
int tzh = Integer.parseInt (qpxTime.substring (16, qpxTime.indexOf (':', 16)));
RootPanel.get().add (new Label ("tzh: " + tzh));
// cf. http://www.docjar.com/html/api/com/google/gwt/i18n/client/TimeZoneInfo.java.html
// cf. http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/i18n/client/constants/TimeZoneConstants.properties
TimeZone tz = TimeZone.createTimeZone ("{\"id\": \"fromOffset\", \"std_offset\": " + (tzh * 60) + ", \"transitions\": [], \"names\": \"\"}");
RootPanel.get().add (new Label ("tz: " + tz));
RootPanel.get().add (new Label ("format plain: " + TIME_OF_DAY_FORMAT.format (dt)));  // 9:00 AM
// cf. http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
RootPanel.get().add (new Label ("format tz: " + TIME_OF_DAY_FORMAT.format (dt, tz)));  // 9:00 AM
RootPanel.get().add (new Label ("tz offset: " + tz.getStandardOffset()));  // 480
RootPanel.get().add (new Label ("format custom: " + TIME_OF_DAY_FORMAT.format (new Date (dt.getTime() + 60L * 60L * 1000L * tzh))));  // 1:00 PM
如果所有时间都包含区域偏移,则可以手动将其应用于时间。但是,如果您也想解析标准区域名称,那么在我看来,您要么在客户端解析时间,要么将时间转换卸载到服务器