0

在 Web 应用程序中,我使用 twitter bootstrap;在服务器端,我使用 spring REST。

我正在使用bootstrap-datetimejs

我使用两种不同的日期格式。

$('#birthdatepicker').datetimepicker({
    viewMode: 'years',
    format: 'DD/MM/YYYY',
    allowInputToggle: true
});

$('#expirationDateCard1, #expirationDateCard2').datetimepicker({
        format: 'MM/YYYY'
});

当我通过 ajax 调用发布时,响应是:

"{"timestamp":1436453221365,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Could not read document: Can not construct instance of java.util.Date from String value '09/07/2015': not a valid representation (error: Failed to parse Date value '09/07/2015': Can not parse date \"09/07/2015\": not compatible with any of standard forms (\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", \"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\", \"EEE, dd MMM yyyy HH:mm:ss zzz\", \"yyyy-MM-dd\"))\n at [Source: java.io.PushbackInputStream@2e700ae1; line: 1, column: 83] 

是否有一些实用程序可以自动进行转换?

4

4 回答 4

2

阅读服务器告诉你的内容

"timestamp": 1436453221365,

问题发生时

"status": 400,
"error": "Bad Request",

您的请求有问题

"exception": "org.springframework.http.converter.HttpMessageNotReadableException",

问题来自您的Java解释器,详细消息是

无法读取文档:无法java.util.Date从字符串值构造实例'09/07/2015':不是有效的表示
(错误:无法解析日期值'09/07/2015':无法解析日期:与任何标准格式 (、、、、)"09/07/2015"不兼容) 在 [来源:; 行:,列:]"
"yyyy-MM-dd'T'HH:mm:ss.SSSZ""yyyy-MM-dd'T'HH:mm:ss.SSS'Z'""EEE, dd MMM yyyy HH:mm:ss zzz""yyyy-MM-dd"
java.io.PushbackInputStream@2e700ae1183

所以基本上,你试图"09/07/2015"java.util.Date它来解释它不知道这意味着什么,试着用不同的方式格式化你的日期。它也为您提供了一些关于格式化日期的可接受方式的提示。我推荐ISO 8601格式

2015-07-09T00:00:00.000Z

JavaScript在它的Date实例上也提供了一种方法来快速执行此操作

new Date(2015, 7, 9).toISOString(); // "2015-08-08T23:00:00.000Z"

但是,请注意,由于我的时区,这与您所期望的有所不同,因此您在执行此操作时可能需要考虑时区。

于 2015-07-09T15:41:17.373 回答
1

您的日期已格式化。服务器正在尝试转换您的日期字符串,但您的日期字符串与所需格式不匹配,因此失败。

我建议您以错误中提到的所需格式之一发送您的日期。

在进行 ajax 调用之前更改日期格式,以便服务器可以自动将其转换为 java 对象。

于 2015-07-09T15:41:41.357 回答
0

正如一些答案所指出的那样,您正在向您的 API 发送一个日期字符串“09/07/2015”,而 API 无法弄清楚如何处理它。(我并不感到惊讶:API 无法知道是 7 月 9 日还是 9 月 7 日,因为这两个日期都可以在世界不同地区用该字符串表示。)

您需要在客户端(可能)添加一个函数,该函数在将日期发送到服务器之前将其解析为明确的格式。像这样的东西(这里有很多伪代码):

$('form').on('submit', function () {
    let formValue = $('#birthdatepicker');
    // Split formValue into month, day, year with .split('/')
    // Update the submitted form parameters with:
    Date.new(year, month, day).toISOString();
    // Or some similar function on Date
});
于 2015-07-09T16:35:23.933 回答
0

尝试通过解析转换为字符串和格式化日期只会浪费时间。解决这个问题的最好方法是使用 new Date();

var d = $("#datetimepicker").datetimepicker('getValue');

new Date(d.getTime());
于 2019-11-05T13:40:51.323 回答