日历日期
如果您的日期应该代表一个日历日期(例如新年是在 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