JavaScript日期时间解析

12

可能是重复问题:
如何在JavaScript中使用格式规范将字符串转换为日期时间?

我有一个JSON响应,其中包含一个类似哈希表的数据结构;

{"map":{"2012-10-10 03:47:00.0":23.400000000000002,"2012-10-10 03:52:00.0":23.3,"2012-10-10 03:57:00.0":23.3,"2012-10-10 04:02:00.0":23.3,"2012-10-10 04:07:00.0":23.200000000000003,"2012-10-10 04:13:00.0":23.1,"2012-10-10 04:18:00.0":23.1,"2012-10-10 04:23:00.0":23.0,"2012-10-10 04:28:00.0":23.0,"2012-10-10 04:33:00.0":23.0,"2012-10-10 04:38:00.0":22.900000000000002,"2012-10-10 04:43:00.0":22.8,"2012-10-10 04:48:00.0":22.8,"2012-10-10 04:53:00.0":22.700000000000003,"2012-10-10 04:58:00.0":22.6,"2012-10-10 05:03:00.0":22.6,"2012-10-10 05:08:00.0":22.5,"2012-10-10 05:13:00.0":22.5,"2012-10-10 05:18:00.0":22.5,"2012-10-10 05:23:00.0":22.400000000000002}}

我想要格式化JSON的日期时间部分,例如;

dd/mm/yyyy HH:mm:ss

假设我将所有的键值对元素放在这样的格式中;

var myArr = [["2012-10-10 03:47:00.0", 23.400000000000002], ["2012-10-10 03:52:00.0", 23.3], ....];

然后,我尝试解析日期时间部分,像下面这样做,但是在控制台上得到了Date {Invalid Date}

new Date(myArr[0][0]);
我该如何格式化这种类型的日期时间?

1
我从 new Date(myArr[0][0]) 中得到了一个有效的日期。(而且它本来就不应该抛出异常。) - pimvdb
实际上,这并不是一个异常情况。当我使用 console.log(new Date(myArr[0][0])); 时,它的输出为 Date {Invalid Date} - vtokmak
2个回答

24

请尝试以下方法:

new Date(Date.parse(myArr[0][0]));

示例

使用 Date.parse 方法将字符串解析成自1970年1月1日00:00:00 UTC以来的毫秒数。然后,使用该毫秒数调用 Date 方法再次将其转换为日期对象。

编辑:

嗯,这可能对于这种情况有点丑陋,但似乎Firefox在处理“-”和“00.0”时出现了问题。

var myArr = [["2012-10-10 03:47:00.0", 23.400000000000002], ["2012-10-10 03:52:00.0", 23.3]];

var date = convertDateTime(myArr[0][0]);
console.log(date);

function convertDateTime(dateTime){
    dateTime = myArr[0][0].split(" ");

    var date = dateTime[0].split("-");
    var yyyy = date[0];
    var mm = date[1]-1;
    var dd = date[2];

    var time = dateTime[1].split(":");
    var h = time[0];
    var m = time[1];
    var s = parseInt(time[2]); //get rid of that 00.0;

    return new Date(yyyy,mm,dd,h,m,s);
}

示例


您的示例仍然存在无效日期错误。 - vtokmak
它在 Firefox 的控制台上报错了 :/ Chrome 渲染正常。 - vtokmak
new Date 接受一个 Date.parse 字符串,正如你链接的 MDN 文章中所述。因此,这个答案不能解决这个问题。 - pimvdb
@vtokmak,更新后的示例应该适用于您。我建议创建一个接受字符串(“2012-10-10 03:47:00.0”)的函数,这样您就可以遍历结果集并调用该函数。 - Chase

11
function dateFromString(str) {
  var m = str.match(/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)\.(\d+)/);
  return new Date(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], +m[6] * 100);
}

dateFromString(myArr[0][0]); // Sat Oct 10 2012 03:47:00 GMT-0500 (EST)

稍微变动以支持 Facebook 日期:str.match(/(\d+)-(\d+)-(\d+)[\sT]+(\d+):(\d+):(\d+).+/) - Dunc
为什么是 m[6] * 100?m[6] 只是秒数,应该在不使用乘法器的情况下传递给 Date 构造函数。 - Stan

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