我有一个Java / Groovy Date,它被转换为String。
Date myDate = new Date();
dateForClient = myDate.toString();
dateForClient通过JSON发送到客户端。所以客户端收到一个JSONString ob dateForClient。
我可以收到字符串:
String dateOnClient = jsonMessage.get("dateForClient").isString().stringValue();
如何将此dateOnClient转换为com.google.gwt.core.client.JsDate?
在通过JSON发送日期之前,我是否必须在服务器端调用toString()方法?事实证明,如果我在服务器端省略了toString(),收到的日期是不正确的?
答案 0 :(得分:1)
您可以使用以毫秒为单位的日期来实例化JsDate。 JsDate和java.util.Date都可以使用一个需要几毫秒的构造函数来实例化。
JsDate jsDate = new JsDate(myDate.getTime());
答案 1 :(得分: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的文档中阅读有关物理日期(“Instants”)和日历日期(“Partials”)之间的区别:http://www.joda.org/joda-time/key_instant.html