2016-09-29 65 views
0

我創建遵循以下規則時間戳的microService:時間戳的microService返回錯誤的時間(節點,快速,瞬間)

1)我可以傳遞一個字符串作爲參數,它會檢查查看該字符串是否包含unix時間戳或自然語言日期(例如:2016年1月1日)

2)如果是,則返回Unix時間戳和該日期的自然語言形式 。 3)如果它不包含日期或Unix時間戳,則爲這些屬性返回空值 。3)如果它不包含日期或Unix時間戳,則返回null 。

它在我以MMMM DD,YYYY格式傳遞日期時起作用,但如果我在unix時間傳遞,我會得到一些完全虛假的值。

var express = require("express"); 
var app = express(); 
var port = process.env.PORT || 3000; 
var moment = require("moment"); 

app.listen(port, function(){ 
    console.log("Listening on port " + port); 
}); 

app.get("/", function(req, res){ 
    res.writeHead(200, {"Content-Type": "text/html"}); 
    res.end("Hi! This is a timestamp microservice. <a href='https://github.com/Humad/timestamp-microservice'>See instructions here.</a>"); 
}); 

app.get("/:date", function(req, res){ 
    var newDate = req.params.date; 

    var natural = moment(newDate, "MMMM D, YYYY"); 
    var unix = moment(newDate, "X"); 

    console.log(natural); 
    console.log(unix); 

    if (natural.isValid() || unix.isValid()) { 
     if (natural.isValid()) { 
      newDate = natural; 
     } else { 
      newDate = unix; 
     } 

     res.json({unix: newDate.format("X"), natural: newDate.format("MMMM D, YYYY")}); 
    } else { 
     res.json({unix: null, natural: null}); 
    } 

    res.end();  
}); 

哦,請讓我知道,如果我不使用正確的風格,或使用任何不良做法;我是新來的這一切

+0

確保您傳遞了正確的unix時間戳。這是一個常見的錯誤。 X unix時間戳以秒計算,而javascript時間戳以毫秒計算。那麼也許你用毫秒來稱呼微服務? – ezakto

+0

@ezakto我都試過;不工作:( –

+0

我相信'moment()'構造函數將在本地時間解析日期,而unix時間戳是UTC。所以確保使用'moment.utc()'而不是'moment( )'。 – ezakto

回答

2

根據當下的文檔:

解析器將忽略非字母數字字符,所以兩個以下將返回同樣的事情[...]

因此,像'1475190112'這樣的unix時間戳實際上會使得natural.isValid() === true,這就是一切都出錯的地方。

幸運的是,該文檔也說:

隨着2.3.0版本,你可以指定一個布爾值的最後一個參數,使瞬間使用嚴格的解析。嚴格的解析要求格式和輸入完全匹配,包括delimeters。

所以,如果你解析你的日期是這樣的:

var natural = moment(newDate, "MMMM D, YYYY", true); 
var unix = moment(newDate, "X", true); 

然後natural.isValid()將返回正確false和預期的一切都將正常工作。