日期选择器解析日期问题

3
我有一个问题: 当我从服务器接收到日期时,我想通过datepicker格式化它,但是datepicker会抛出异常,因为它无法解析该日期。 这是来自服务器的日期(obj.value): 08.20.2012 19:01:32 以下是我尝试解析此日期的代码: $.datepicker.formatDate('dd.MM.yy', new Date(obj.value)); 我使用MM,因为我需要月份的全名。 解析后的输出如下: NaN.NaN.NaN 那么如何摆脱这个异常?

那么JS和jQuery这么弱?哼! - Helgus
这是Date对象构造函数具体IE8实现的弱点。jQuery不涉及日期,它关注于DOM操作。 - Konstantin Isaev
5个回答

4

您需要将日期(obj.value)更改为有效的JavaScript日期格式。最好在服务器端完成。

如果您想在客户端上执行此操作,您需要使用/替换.,以便获得08/20/2012 19:01:32而不是08.20.2012 19:01:32

new Date(obj.value.replace(/\./g, '/'))

这是对服务器不必要的负载。 - Helgus
这是对服务器不必要的负载,呃? - fredrik
它增加了一年)) console.log($.datepicker.formatDate('dd.MM.yy', new Date(obj.value.replace(/./g, '/') ))); 输出08.八月.2013。 - Helgus
console.log(new Date(obj.....) 给你什么?我认为你需要先设置日期,然后再设置格式。请参阅文档 http://jqueryui.com/demos/datepicker/ - fredrik
console.log(new Date(obj.value)); 会输出 Date {Invalid Date}。 - Helgus
显示剩余4条评论

1

您正在尝试在JavaScript中解析日期,这完全取决于实现。似乎许多浏览器无法解析您提供的字符串。您将需要执行以下两个操作之一:

  • 提供有效的字符串。
  • 调用Date构造函数。

还请参阅此答案:为什么Date.parse会给出不正确的结果?


0

Date() 只接受 整数字符串。在将其传递给 Date() 之前,您应该处理 obj 的值。


但是 08.20.2012 19:01:32 是一个字符串。 - Helgus

0

如果您可以控制服务器返回的内容,最简单的方法是返回 UNIX 时间戳而不是格式化日期字符串。

UNIX 纪元和 Javascript 纪元是相同的(1970 年 1 月 1 日 00:00),但 UNIX 时间戳以秒为单位,而 javascript 的 Date 对象使用毫秒。

因此:

$.datepicker.formatDate('dd.MM.yy', new Date(obj.value * 1000));

正如您可以在这里看到的那样,obj.value 可以是整数或字符串。在字符串的情况下,JavaScript 的自动类型转换会处理乘法运算。


输入的日期格式为上述格式,而不是1970年以来的秒数。 - Helgus
UNIX时间戳是传输日期/时间的事实标准格式。这是未来需要记住的事情。 - Beetroot-Beetroot

0
首先,您需要将传入的日期字符串重新格式化为JavaScript Date()函数可解析的格式。如果您无法控制来自服务器的格式,我建议使用以下格式:
var incDate, dateString, timeString, dateSplit, timeSplit;
incDate = obj.value.split(" ");
dateString = incDate[0];
timeString = incDate[1];
dateSplit  = dateString.split(".");
timeSplit = timeString.split(":");
$.datepicker.formatDate('dd.MM.yy', new Date(dateSplit[2],dateSplit[0]-1,dateSplit[1],timeSplit[0],timeSplit[1],timeSplit[2]));

它说日期是2013年8月8日。 - Helgus
您确定已正确输入日期拆分部分为2,0,1吗?Date对象要求按年、月、日的降序输入,如果您输入了2,1,0(2012,20,8),它将取20个月并将其转换为1年8个月,导致您当前看到的日期为8/8/2013。此外,请确保不要忘记在月份部分上减去“-1”,因为这实际上是一个0-11的值(第0个月=一月)。 - Simon West
我刚刚复制了你的代码,但它不起作用,然后我在dateSplit [2]上添加了“-1”,年份是2012。但为什么日期是08而不是20? - Helgus
你确定你接收到的日期格式是 08.20.2012 19:01:32 而不是 20.08.2012 19:01:32 吗?我能想到的唯一可能是你实际上接收到了后者。如果是这样,你需要将 dateSplit 的顺序调整为 2、1、0。 - Simon West
实际上,我不需要这一天,但我很感兴趣为什么它能够工作 :) - Helgus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接