0

我有一个转换为字符串的 Java/Groovy 日期。

Date myDate = new Date();
dateForClient = myDate.toString();

dateForClient 通过 JSON 发送到客户端。所以客户端收到一个 JSONString ob dateForClient。

我可以将字符串接收为:

String dateOnClient = jsonMessage.get("dateForClient").isString().stringValue();
  1. 如何将此 dateOnClient 转换为 com.google.gwt.core.client.JsDate?

  2. 在通过 JSON 发送日期之前,我是否必须在服务器端调用 toString() 方法?事实证明,如果我在服务器端省略了 toString(),接收到的日期不正确?

4

2 回答 2

1

您可以使用以毫秒为单位的日期来实例化 JsDate。JsDate 和 java.util.Date 都可以使用需要毫秒的构造函数进行实例化。

JsDate jsDate = new JsDate(myDate.getTime());
于 2013-08-21T09:29:03.017 回答
1

日历日期

如果您的日期应该代表一个日历日期(例如新年是在 1 月 1 日 00:00:00,与时区无关),那么最好将日期作为格式化字符串发送。所以在服务器端,你会这样做:

// ISO 8601 format without (!) timezone
DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
Date myDate = new Date(...); // to avoid time zone problems here, prefer
                             // storing calendar dates on the server as
                             // Strings, too (or use Joda Time Partials)
String dateForClient = DATE_FORMAT.format(myDate);

在客户端你理论上可以使用

JsDate jsDate = JsDate.parse(dateOnClient); // not ideal

然而,JavaScript 日期解析有些不可靠,请参阅http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html

所以最好让 GWT 帮助你:

DateTimeFormat dtf = DateTimeFormat.getFormat(PredefinedFormat.ISO_8601);
Date date = dtf.parseStrict(dateOnClient);
JsDate jsDate = JsDate.create(date.getTime());

实际日期

但是,如果您的日期应该代表一个物理时间点(例如,飞机于 8 月 21 日 10:00:00 UTC 起飞),那么您可以

a) 同上,但修改服务器端的 DATE_FORMAT 以包含时区:new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

b) 但通过 JSON 发送毫秒值可能要简单得多。所以在服务器端,你会做

Date myDate = new Date();
String dateForClient = "" + myDate.getTime();

(注意,我们仍然使用 String 来传输值,因为 JavaScript 的数字范围不足以传输所有可能的long值。)

在客户端你会做

JsDate jsDate = JsDate.create(new Long(dateOnClient));

更多背景

不幸的是,Joda Time 在 GWT 客户端仍然不能很好地使用,否则我建议阅读 Joda Time 的文档中有关物理日期(“即时”)和日历日期(“部分”)之间的区别:http: //www.joda.org/joda-time/key_instant.html

于 2013-08-21T10:45:43.853 回答