0

我正在尝试用 Jersey 编写一个 REST-API。从javascript我得到一个日期字符串,如:

Tue Oct 16 2012 07:10:55 GMT+0200 (CEST)

(就是这样

new Date().toString()

可以,但这不在我的范围内。)

这个日期字符串可以通过实现一个自己的@ContextResolver 来解析。我在谷歌上搜索了大约一天,我能整理的最好的 SimpleDateFormat 是:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'z '('z')'", Locale.ROOT);

但正如您所见,“GMT”部分和括号是“硬编码”的。在不更改 javascript 部分的情况下有没有更好的解决方案?

4

2 回答 2

0

你可以试试toLocaleDateString()

于 2012-10-16T05:38:48.693 回答
0

@kidmenot:感谢您的链接,但该解决方案需要在 java 端“手动”处理 javascript-date 并更改 Javascript 端。所以最后我们只需要更改 javascript-part。有

var myDate = new Date():
// ... many LOCs
var myDateString = "" + myDate + "";

分散在 js 代码中。所以只需将其更改为

var myDate = new Date():
// ... many LOCs
var myDateString = myDate;

解决了这个问题,因为后来是

JSON.stringify()

就在将其发送到服务器之前。JSON.stringify ()调用myDate.toJSON()返回一个 ISO-8601 日期字符串,由 Jersey 处理,无需任何进一步的编码。

所以我们选择了这个解决方案来避免未来的并发症。

半年后编辑:

这个解析问题经常发生,最终由于一些 js 框架而不可避免。以下是我们的 Java 解决方案:

public static Date jsDateStringToJavaDate(String jsDateString) throws ParseException{

    String[] arrStrDateParts = jsDateString.split(" ");
    SimpleDateFormat sdf = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss", Locale.ENGLISH);
    sdf.setTimeZone(TimeZone.getTimeZone(arrStrDateParts[5].substring(0,6)+":"+arrStrDateParts[5].substring(6)));
    return sdf.parse(arrStrDateParts[0]+" "+arrStrDateParts[1]+" "+arrStrDateParts[2]+" "+arrStrDateParts[3]+" "+arrStrDateParts[4]);       
}

如果您有更好的解决方案,请在此处发布。谢谢

于 2012-12-10T17:54:09.567 回答