Можете ли вы установить время вашего сервера, отличное от вашего локального компьютера? - PullRequest
0 голосов
/ 01 ноября 2018

У меня проблема с локальной отладкой. У меня есть удаленный сервер, который настроен на UTC. Мое приложение ведет ежедневный текущий счет, и я рассчитываю его, беря все значения для конкретного человека, прошедшего определенную дату оборота. Для моего приложения это 1:00 CST или 6:00 UTC. Проблема, с которой я сталкиваюсь, заключается в том, что если мой локальный компьютер настроен на CST, то логика момента времени испорчена, потому что начало дня (1:00) вычисляется на основе времени CST вместо времени UTC.

Если я изменю время своего локального компьютера на 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 голосов
/ 01 ноября 2018

Несколько вещей:

  • Вообще говоря, на любом языке программирования, когда предполагается использовать код на сервере, код должен быть спроектирован таким образом, чтобы он не зависел от настройки часового пояса этого сервера. Вы должны получить одинаковые результаты независимо от того, где выполняется код. Это значит не использовать функции местного времени. Зарезервируйте эти функции для кода, который выполняется на компьютере или устройстве пользователя. Они обычно не имеют цели на сервере и приводят к проблемам, подобным тем, которые вы описываете.

  • В вашем коде вы установили CST, вычитая 6 часов. Это фактически выбирает другой момент времени, а не устанавливает смещение часового пояса. С помощью Момента вы можете изменить смещение часового пояса с помощью функции utcOffset:

    let cst = moment().utcOffset(-6);
    
  • В то время как вы сказали CST в своем вопросе, учтите, что большинство мест, которые соблюдают Центральное стандартное время в США и Канаде, переключаются между CST (UTC-6) и CDT (UTC-5) в зависимости от того, действует летнее время или нет. Если вы действительно имеете в виду CST, то используйте функцию utcOffset, как я показал выше. Но если вы действительно имели в виду центральное время, то вам нужно будет установить расширение Moment-Timezone и использовать вместо него функцию tz. Идентификатор часового пояса для CT в США - America/Chicago, поэтому:

    let ct = moment.tz('America/Chicago');
    
  • Остальная часть вашего кода выглядит нормально, хотя вы можете подумать, что Moment по сути является устаревшим проектом. Если вы пишете новый код, предназначенный для работы в современных браузерах и / или в последних версиях Node.js, команда Moment рекомендует использовать вместо него Luxon . Рассмотрим Luxon, как будто это был Момент 3.0 с новым API. Например:

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