2017-01-16 42 views
1

我的res.json函数似乎在修改我的数据。如果我在函数中记录数据,它将返回正确的数据。只有在res.json中,我的数据才发生变化,我找不到原因。res.json返回无意修改的输入

对于离。而不是返回{"unix":"1484600306","naturalFormat":"2017-01-16"}的返回{"unix":"1484600306","naturalFormat":"\"2017-01-16\""}.

功能:

function unixToDate(timestamp) { 
    var a = new Date(timestamp * 1000); 
    //console.log(a); 
    var rgx = /T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z/; 
    var newA = JSON.stringify(a); 
    //console.log(newA.replace(rgx, "")); 
    return newA.replace(rgx, ""); 
} 

路线

router.get('/:unix', function(req, res) { 
    var timestamp = req.params.unix; 
    var regex = new RegExp("\\d{10}"); 
    if (regex.test(timestamp)) { 
    var date = unixToDate(timestamp); 
    console.log(date); 
    res.json({ unix : timestamp, naturalFormat : date }); 
    } else { 
    res.json({ unix: null, naturalFormat : null}); 
    } 
}); 

再次声明,我对于新手用正则表达式,如果我猜它必须是与该。

PS我没有使用toString(),因为我的日期出现错误,即2015年11月30日而不是2015年12月1日,所以这就是为什么我用正则表达式这样做。

谢谢!

+1

这是一个XY问题。不要绕过日期对象。使用momentjs作为你的用例。 – Amberlamps

回答

1

的问题是在unixToDate,在这里:

var newA = JSON.stringify(a); 

你序列化日期为JSON,这意味着newA会是这样的字符串:"2017-01-16T00:00:000.000Z"包括引号。然后,当您拨打res.json时,它会再次序列化该字符串,引号和全部。

最简单的方法是用Date.prototype.toISOString代替。它会返回相同的字符串如上述,不带引号:

var newA = a.toISOString(); 

事实上,你删除与String.prototype.replace日期的时间部分的方法是一个有点令人费解。 ISO 8601的日期在每个位置总是有相同的位数,所以为什么不使用String.prototype.slice

function unixToDate(timestamp) { 
    var date = new Date(timestamp * 1000); 
    return date.toISOString().slice(0, 10); 
} 
+0

太棒了!我重视@amberlamps的建议,但我需要知道我做错了什么。完善!谢谢! – Quesofat

+1

Moment.js很棒。它也经常是过度杀伤。 –