Выполнение функции каждую полночь в часовом поясе (CST), отличном от часового пояса сервера (UTC)

#node.js #momentjs #moment-timezone

#node.js #momentjs #момент-часовой пояс

Вопрос:

У меня есть часовой пояс (timerTimeZone): например, для «Америка / Чикаго».

пусть timerTimeZone = «Америка / Чикаго»

Местное время нашего сервера указано в UTC.

Я хочу выполнять функцию каждую ночь в 12.00 в часовом поясе, который хранится в переменной timerTimeZone .

Допустим, программа запущена в 6:00 вечера по Гринвичу / 1.00 вечера по восточному времени. Таким образом, первое выполнение должно быть после 11 часов (12.00 утра по восточному времени), а последующие последующие выполнения каждые 24 часа.

Я пытался использовать moment и moment-timezone, но не смог найти никакого способа.

Ответ №1:

Я бы предложил использовать отличный модуль Cron.

Это позволяет планировать задачи в соответствии с выражением cron, а также позволяет указать часовой пояс IANA для использования.

Я также регистрирую здесь следующие 5 дат, в которые будет выполняться задание, как в указанном часовом поясе, так и в UTC.

 const CronJob = require("cron").CronJob;

// Run at midnight every night
const cronExpression = "00 00 * * *";

const timeZone = "America/Chicago";

const cronJob = new CronJob(
    cronExpression,
    cronFunction,
    null,
    true,
    timeZone
);

function cronFunction() {
    console.log("cronFunction: Running....");
    /* Do whatever you wish here... */
}

// Get the next N dates the job will fire on...
const nextDates = cronJob.nextDates(5);
console.log(`Next times (${timeZone}) the job will run on:`, nextDates.map(d => d.tz(timeZone).format("YYYY-MM-DD HH:mm")));
console.log("Next times (UTC) the job will run on:", nextDates.map(d => d.utc().format("YYYY-MM-DD HH:mm")));