из `const now = new Date ()`, как я могу убедиться, что я нахожусь до или равен определенной дате в заданном часовом поясе и часе? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть карта часовых поясов с часом публикации в локальной зоне с новостями, которые должны определить, когда они должны быть опубликованы в дату с использованием средства выбора даты.

Это новая новость article, которая инициализирована со следующим:

  • { timeZoneId: 'Europe/Paris, releaseHour: 9, publishingDateTime: undefined } // 9 - это время по Гринвичу + 1

Я хочу знать, как я могу с const now = new Date(), проверить, если эта статья должны быть опубликованы сегодня или на следующий день, критерии:

  • Является ли now до releaseHour? (9:00 по Гринвичу + 1 в Париже уже прошло или нет)
  • Если да, то мы должны предложить следующий релиз в 9:00 по Гринвичу + 1 + 1 день
  • Если нет, тогда мы должны используйте слот для релиза в 9 утра в тот же день

Как это возможно?

Вот как я пытался:

import { isBefore, isEqual } from 'date-fns';
import { utcToZonedTime } from 'date-fns-tz';

export const getNextPublishingDateTime = (now, timeZoneId, releaseHour) => {
  const zoned = utcToZonedTime(now, timeZoneId);
  const releaseTime = new Date(zoned.toISOString());
  releaseTime.setHours(releaseHour, 0, 0, 0);
  if (isBefore(zoned, releaseTime) || isEqual(zoned, releaseTime)) {
    console.log('before');
    return releaseTime;
  }
  releaseTime.setDate(releaseTime.getDate() + 1);
  console.log('after');
  return releaseTime;
};

Но час вернулся utcToZonedTime - это не смещение +01: 00, а дата с моим смещением.

Я попробовал некоторые другие идеи, используя moment-tz и vanilla Date, я нашел эту задачу немного сложной и надеемся найти помощь в сообществе JS, так как это выглядит как обычное сравнение дат.

1 Ответ

0 голосов
/ 22 марта 2020

Вы можете использовать объект Intl и formatToParts , чтобы получить текущее время в любом поддерживаемом часовом поясе, используя IANA репрезентативные местоположения . Это достаточно хорошо поддерживается .

Например

function getHour(date, loc) {
  let d = new Intl.DateTimeFormat("en-EN", {
    hour: 'numeric',
    hour12: false,
    timeZone: loc
  });
  return d.formatToParts(date)[0].value;
}

let loc = 'Europe/Paris';
let now = new Date();
console.log(`The current hour in ${loc} is ${getHour(now, loc)}.`);

Выше приведен только для иллюстрации, должна быть проверка входных и возвращаемых значений.

...