Timestamp微服务返回错误的时间(Node,Express,Moment)

时间:2016-09-29 21:41:07

标签: node.js date

我正在创建遵循以下规则的时间戳微服务:

  

1)我可以传递一个字符串作为参数,它将检查该字符串是否包含unix时间戳或自然语言日期(例如:2016年1月1日)

     

2)如果是,则返回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();    
});

哦,如果我没有使用正确的风格或使用任何不良做法,请告诉我。我对这一切都不熟悉

1 个答案:

答案 0 :(得分:2)

根据当下的文件:

  

解析器忽略非字母数字字符,因此以下两个都将返回相同的内容[...]

因此,像'1475190112'这样的unix时间戳实际上会生成App,这就是一切都出错的地方。

幸运的是,文档也说:

  

从版本2.3.0开始,您可以为最后一个参数指定一个布尔值,以使Moment使用严格的解析。严格的解析要求格式和输入完全匹配,包括分隔符。

所以,如果你像这样解析你的日期:

natural.isValid() === true

然后var natural = moment(newDate, "MMMM D, YYYY", true); var unix = moment(newDate, "X", true); 将正确返回natural.isValid(),一切都会按预期运行。