Javascript没有正确地在Date()构造函数中占用一天

时间:2017-09-28 23:32:27

标签: javascript date express momentjs

我正在开发一个API,用户可以在该API中询问特定年份和月份的交易。 API看起来像

routes.get('/transactions/:member_id/:year/:month', (req, res) => {
    let {member_id, year, month} = req.params;
    let start_date = new Date(year, month - 1, 1);
    let end_date = moment(start_date).add(1, 'months');

    console.log({start_date, end_date});
    res.send({start_date, end_date})
});

我使用ExpressJS来构建API,使用momentjs来操作日期。

当我以http://localhost:8080/transactions/m/2017/10点击此API时,我会询问用户m,年2017和月10的交易,这是10月的原因(这就是我{{} 1}}在我上面的实现中)。

我在month - 1取回的内容是

console

我感到困惑,因为该月的开始日已被硬编码为{ start_date: 2017-09-30T11:00:00.000Z, end_date: moment("2017-11-01T00:00:00.000") }

1

而不是let start_date = new Date(year, month - 1, 1); 。这里出了什么问题?

2 个答案:

答案 0 :(得分:1)

这是时区的问题。你能做的是:

let start_date = new Date(year, --month);
start_date.setUTCDate(1);

JavaScript Date()使用客户端本地时区。为了获得一致的结果,JavaScript Date()具有utc方法来帮助基于GMT世界标准时间标准化日期。查看MDN's JavaScript Date Reference

或者,你也可以这样做:

let start_date = new Date(Date.UTC(year, --month, 1));

答案 1 :(得分:0)

这看起来像是时区问题。

在您的客户端中,您可以使用Date.prototype.getTimeZoneOffset(),然后将其添加到您的日期。 但是你必须在你的网址上添加一些时间参数。

哦时区;虽然艺术是一个冷酷的情妇。