2017-01-16 74 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很棒。它也經常是過度殺傷。 –