【问题标题】:How to parse date string using Timezone in GWT如何在 GWT 中使用时区解析日期字符串
【发布时间】:2011-07-03 13:32:08
【问题描述】:

有没有人成功地在 GWT 中使用自定义时区解析日期字符串? GWT 的 DateTimeFormat 允许根据时区格式化日期,但我还没有找到任何相反操作的方法。那么如果我有以下字符串“02:01:2011”(格式“MM:dd:yyyy”),我该怎么办。它可以在不同的时区产生不同的结果。

尝试更改日期、月份等时会出现另一个问题。如何根据自定义时区进行操作?

也许有任何库可以简化所有这些操作?


我已经制定了解决方法并将时区部分添加到每个错过该部分的日期字符串中。仍在寻找更专业的解决方案。

【问题讨论】:

标签: java javascript gwt date timezone


【解决方案1】:

要么将时区从服务器提供给客户端(例如,将其包含在日期字符串中),要么标准化服务器上​​的时区,以便客户端可以假设一个恒定的时区。如果您在日期字符串中包含时区,则下面的代码 sn-p 应该可以工作。

我没有对此进行测试,但根据文档,它应该可以工作:

String dateStr = "04/21/2011 01:37:36 -0800;
DateTimeFormat format = new DateTimeFormat("MM/dd/yyyy HH:mm:ss Z");
Date date = format.parse(dateStr);

根据您表示时区的方式,您可以更改格式字符串(Z)中的最终变量。详见文档:http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/i18n/client/DateTimeFormat.html

【讨论】:

  • 问题是如何在不将时区部分附加到我的日期字符串的情况下做到这一点。
  • 将时区添加到字符串是处理此 IMO 的正确方法。另一种方法是自己管理偏移量,但是你必须担心你所在的时区并且知道正确的偏移量(这可能会因为 DST 而改变)。通常,我总是将日期保持在 UTC 格式,然后让 DateTimeFormat 在格式化它们以输出到浏览器时将它们放在正确的时区。您可以将时区与 UTC 日期一起传递给格式方法。
  • 但是您不能从 UI 中检索像 04/14/2011 这样的日期并根据自定义时区将其解析为 java Date。我喜欢“Bartek Jablonski”解决方案,但现在我没有时间研究它。
  • 自定义时区从何而来?如果您将其作为 GWT 时区对象,则只需将偏移量添加到日期(timezone.getOffset() 从 UTC 返回分钟数)。日期将始终被解析为 UTC,并且时区始终与 UTC 有正确的偏移量。
  • 如果 format 和 parse 是反射式的就好了。应该有一个使用时区的 parse 方法,它还应该适用于格式化输出的 v 和 z 格式。
【解决方案2】:

我执行以下操作来解析 TimeZone tz 中的日期。 它可能很狡猾,但它有效:-

final long MILLIS_IN_MINUTE = 60000;

Date localDate = DateTimeFormat.getFormat("dd MMM yyyy HH:mm:ss").parse(dateString);

int localOffset = localDate.getTimezoneOffset() * MILLIS_IN_MINUTE;
int targetOffset = tz.getOffset(localDate) * MILLIS_IN_MINUTE;

// Subtract the offset to make this into a UTC date.
return new Date(localDate.getTime() - localOffset + targetOffset);

它解析客户端时区中的日期,然后将其调整为所需的时区。

【讨论】:

  • 或 getFormat("...ss z").parse(dateString+" UT") ?
【解决方案3】:

最近我通过了这个项目:gwt-calendar-class,它在 javascript 中模拟 Calendar 和 TimeZone。

【讨论】:

  • 看起来不错,但我已经通过将时区部分附加到我的数据字符串来完成它。我不知道您的解决方案是否足够成熟,这就是为什么我无法将其标记为正确的原因。有时间我会尝试测试一下。
【解决方案4】:
public static Date getDateGWT(final String strDate, final int style) {
        Date date = null;
        int useStyle = style;
        if (!validStyle(style)) {
            useStyle = DEFAULT_DATE_STYLE;
        }

        if ((strDate != null) && (strDate.trim().length() > 0)) {
            DateTimeFormat df = getDateFormatGWT(useStyle);
            try {
                date = df.parse(strDate);
            } catch (Exception e) {
                date = df.parse(date.toString());
            }
        }
        return date;
    }

     private static DateTimeFormat getDateTimeFormatGWT(final int style) {
        switch(style) {
        case SHORT:
            return DateTimeFormat.getShortDateTimeFormat();
        case MEDIUM:
            return DateTimeFormat.getMediumDateTimeFormat();
        case LONG:
            return DateTimeFormat.getLongDateTimeFormat();
        case FULL:
            return DateTimeFormat.getFullDateTimeFormat();
        default :
            return DateTimeFormat.getMediumDateTimeFormat();
        }        
   }

试试这个

【讨论】:

  • 它如何帮助我处理时区?
猜你喜欢
  • 2015-09-24
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
相关资源
最近更新 更多