我的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年1月12日这就是为什么我用正则表达式这样做的原因。
谢谢!
答案 0 :(得分: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);
}