我正在创建遵循以下规则的时间戳微服务:
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();
});
哦,如果我没有使用正确的风格或使用任何不良做法,请告诉我。我对这一切都不熟悉
答案 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()
,一切都会按预期运行。