您可以将服务器的时间设置为与本地计算机不同吗?

时间:2018-11-01 16:10:59

标签: node.js time server timezone momentjs

我遇到了本地调试问题。我有一个设置为UTC的远程服务器。我的应用程序保持每天的跑步成绩,我通过获取特定人员的某个特定日期的所有值来计算该成绩。对于我的应用程序,这是CST上午1点或UTC上午6点。我遇到的问题是,如果我将本地计算机设置为CST,则由于基于CST时间而非UTC时间来计算一天的开始时间(凌晨1点),因此momentjs逻辑混乱了。

如果我将本地计算机的时间更改为UTC,那么前端逻辑将不再有意义,因为我让前端将日期转换为用户应使用的本地时间。基本上,我需要模拟2个在不同时间工作的服务器。有人知道这样做的方法吗?

一天的开始时间计算如下:

const moment = require('moment');
module.exports = function getStartOfDay(){
        //set the start of the day to central standard time. It defaults to
        //UTC 0 otherwise;
        let now = moment();
        let cst = moment(now).subtract(6, 'hours');
        let midnight = moment(cst).startOf('day');
        let START_OF_DAY = moment(midnight).add(6, 'hours').utc();
        let START_OF_WEEK = moment(cst).startOf('week').add(6, 'hours').utc();
        let START_OF_MONTH = moment(cst).startOf('month').add(6, 'hours').utc();

        return {now, cst, midnight, START_OF_DAY, START_OF_WEEK, START_OF_MONTH}
};

首先我得到了实际时刻,

然后我减去6小时以确保计算出正确的日期

那我就从那天开始,最后再增加6小时以补偿UTC偏移

您可以看到我的本地计算机是否在CST时间运行,然后显示以下行: let now = moment(); 会错的

1 个答案:

答案 0 :(得分:1)

几件事:

  • 通常来说,在任何编程语言中,当要使代码在服务器上运行时,都应对代码进行设计,以使其不依赖于该服务器的时区设置。无论代码在何处执行,您都应获得相同的结果。这意味着不使用本地时间功能。将那些功能保留给在用户计算机或设备上执行的代码。它们通常在服务器上没有目的,并会导致诸如您所描述的麻烦。

  • 在您的代码中,您通过减去6小时来设置CST。实际上,这是在选择其他时间,而不是设置时区偏移。使用Moment,您可以使用utcOffset函数来更改时区偏移量:

    let cst = moment().utcOffset(-6);
    
  • 尽管您在问题中说了CST,但请注意,在美国和加拿大,大多数遵守中央标准时间的地方都在CST(UTC-6)和CDT(UTC-5)之间切换启用或不启用夏令时。如果您真的是说CST,请使用上面显示的utcOffset函数。但是,如果您实际上是指中部时间,则需要安装Moment-Timezone扩展名,并使用tz函数。美国的CT时区ID为America/Chicago,因此:

    let ct = moment.tz('America/Chicago');
    
  • 您的其余代码看起来不错,尽管您可能希望考虑Moment本质上是一个遗留项目。如果您要编写旨在在现代浏览器和/或最新版本的Node.js上运行的新代码,那么Moment团队建议您改用Luxon。将Luxon视为带有新API的Moment 3.0。例如:

    const { DateTime } = require('luxon');
    let ct = DateTime.fromObject({zone: 'America/Chicago'});
    console.log(ct.toISO()); // "2018-11-01T12:31:10.140-05:00"