将Java Date转换为字符串到JsDate?

时间:2013-08-21 09:25:33

标签: java json gwt

我有一个Java / Groovy Date,它被转换为String。

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(),收到的日期是不正确的?

2 个答案:

答案 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