Как я могу проверить дату и время на javascript? - PullRequest
1 голос
/ 06 мая 2020

Мой сценарий выглядит следующим образом:

function checkDatetime() {
    const e = new Date((new Date).toLocaleString("en-US", {
        timeZone: "Asia/Jakarta"
    }));
    return e.getDay() >= 1 && e.getDay() <= 5 && e.getHours() >= 8 && e.getHours() < 17
}

если checkDatetime вернет true, он покажет сообщение «Доступно»

если checkDatetime вернет false, он покажет сообщение «Not Available»

Я тестировал его, и он работает. Моя позиция в Джакарте (Индонезия)

Но есть люди, которые вызывают функцию в 18:20 и 22:22, и она показывает «Доступно»

Если отображается «Недоступно»

Это проблема часового пояса?

Обновление :

Другое решение от меня:

function checkDatetime() {
  const offsetHours = new Date().getTimezoneOffset() / 60;
  const day = new Date();

  day.setHours(day.getHours() + offsetHours);

  return day.getDay() >= 1 && day.getDay() <= 5 && day.getHours() >= 1 && day.getHours() < 10;
}

Ответы [ 3 ]

1 голос
/ 06 мая 2020

У вас есть фундаментальное недопонимание объектов ECMAScript Date. Они представляют собой просто смещение от 1970-01-01T00: 00: 00Z и не имеют других связанных данных, таких как часовой пояс или смещение.

Выражение:

new Date((new Date).toLocaleString("en-US", {
    timeZone: "Asia/Jakarta"
}));

(new Date) создает date для текущего времени, вызов toLocaleString с параметрами дает метку времени для текущей даты и времени для местоположения «Азия / Джакарта».

Это затем анализируется включающим вызовом конструктора Date для создания Date для того же самого момента времени. Если полученная строка включает имя часового пояса или смещение для "Asia / Jakarta" (что может или не может быть, в зависимости от реализации), это то же самое, что:

 new Date();

So getDay возвращает день для местного часового пояса, а не для "Азии / Джакарты". Также обратите внимание, что встроенный синтаксический анализатор может некорректно анализировать строку, возвращаемую toLocaleString , особенно там, где использовались параметры.

Если вы хотите использовать встроенные методы, обратите внимание на конструктор Intl.DateTimeFormat и метод formatToParts . Это вернет строковые значения для частей даты и времени для определенного репрезентативного местоположения, такого как «Азия / Джакарта». Затем вы можете делать что-то с частями, как с методами даты.

Обратите внимание, что некоторые части даты имеют разные имена по сравнению с соответствующими методами даты, также возвращаются имена дней, а не числа.

function checkDatetime(loc) {
  let f = new Intl.DateTimeFormat('en', {
    year    : 'numeric',
    month   : '2-digit',
    day     : '2-digit',
    weekday : 'short',
    hour    : '2-digit',
    hour12  :  false,
    minute  : '2-digit',
    second  : '2-digit',
    timeZone: loc
  });
  let temp = f.formatToParts(new Date());
  let parts = temp.reduce((acc, part) => {
    if (part.type != 'literal') {
      acc[part.type] = part.value;
    }
    return acc;
  }, Object.create(null));
  
  // Debug
  console.log(parts);
  
  return parts.weekday != 'Sat' && parts.weekday != 'Sun' &&
         parts.hour >= 8 && parts.hour < 17;
}

console.log(checkDatetime('Asia/Jakarta'));
1 голос
/ 06 мая 2020
Объект

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

Вы можете использовать библиотеку момент. js, а затем использовать функцию

var timeDifference = new Date().getTimezoneOffset();

для рассчитать разницу часовых поясов клиента с UT C.

Или вы можете использовать

var timeZone = moment.tz.guess();

Он вернет идентификатор часового пояса IANA, например America / Los_Angeles для часового пояса Тихого океана c США.

enter image description here

Это одна из картинок с момента. js веб-сайт, где вы можете увидеть, как с этим справиться.

0 голосов
/ 06 мая 2020

Я протестировал вашу функцию, и она работает так, как должна, ie, возвращает истину, если она MF, 8-5 в JKT и ложь, если нет.

Я могу думать о двух возможных проблемах: 1. Возникла проблема с функцией, вызывающей checkDateTime и возвращающей «Доступно» или «Недоступно» 2. На вашем сервере не установлены текущие дата и время, и, следовательно, даже если вы конвертируете datetime в часовой пояс JKT, ваша функция не вернет ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...