Helpers - компьютеры, интернет, программирование

Как сравнить два значения даты из разных объектов, отформатировать их и проверить на равенство?

У меня есть два массива, содержащие объекты. Один выглядит так:

const seatGeekEvents = [
      {
        datetime_local: "2020-09-15T20:00:00",
        venue: {
          name: "House of Blues - Boston",
        },
      },
    ]; ...

а другой вот так:

 const hourlyForecast = [
      {
        clouds: 40,
        dt: 1600200000, 
        temp: 67.44,
      },
    ]; ...

Я хотел бы сделать функцию, которая просматривает объекты в массивах, выясняет, совпадают ли значения времени в объектах, и если они совпадают, возвращает данные из объектов, которые имеют совпадающие времена. Позже я буду отображать данные с помощью HTML.

Конечная цель здесь состоит в том, чтобы создать html-таблицу данных о событиях с данными о погоде на момент начала события. Объекты являются ответами, возвращаемыми из выборки.

Вот функция, которую я придумал для поиска совпадений:

const getDataToDisplay = (seatGeekEvents, hourlyForecast) => {
      const dataToDisplay = [];
      for (i = 0; i < seatGeekEvents.length; i++) {
        const matches = [];
        for (j = 0; j < hourlyForecast.length; j++) {
          if (
            formatEventTime(seatGeekEvents[i].datetime_local) ===
            formatWeatherTime(hourlyForecast[j].dt)
          ) {
            matches.push(seatGeekEvents[i], hourlyForecast[j]);
          }
        }
        return matches;
      }
      return dataToDisplay;
    };

    console.log(getDataToDisplay(seatGeekEvents, hourlyForecast));

Функции форматирования, которые я использую для покрытия dt и datetime_local, выглядят так:

 const formatEventTime = (startTimeUTC) => {
      const date = new Date(startTimeUTC);
      return date.toLocaleTimeString("en-US", {
        hour: "2-digit",
        minute: "2-digit",
        weekday: "long",
      });
    };

    const formatWeatherTime = (forecastTimeStamp) => {
      const milliseconds = forecastTimeStamp * 1000;
      const dateObject = new Date(milliseconds);
      return dateObject.toLocaleTimeString("en-US", {
        hour: "2-digit",
        minute: "2-digit",
        weekday: "long",
      });
    };

Я хотел бы понять, почему мой getDataToDisplay() возвращает пустой массив. Это просто проблема форматирования времени? Спасибо


  • 2020-09-15T20:00:00 не имеет связанного смещения, поэтому будет представлять разные моменты времени в каждом другом месте с другим смещением. 1600200000, вероятно, представляет собой значение времени в секундах с 1970-01-01 (то есть представляет 2020-09-15T20:00:00.000Z), что является уникальным моментом времени. Как вы хотите обрабатывать первую метку времени? 13.09.2020
  • Не используйте встроенный парсер. 2020-09-15T20:00:00 следует рассматривать как локальный, но Safari рассматривает его как UTC. 13.09.2020
  • Спасибо @RobG. Как я хочу относиться к первой метке времени? Начну ли я с первой временной метки или со второй, это произвольно. Я думаю, что моя главная проблема в том, что я просто не знаю, как сравнивать Unix с UTC в vanilla js. (в данном случае меня связывает ваниль) 14.09.2020
  • @RobG спасибо, что сообщили мне о встроенном парсере для Safari. В настоящее время работает с Chrome. Сделаю заметку, чтобы иметь дело с обоими браузерами. 14.09.2020
  • @RobG Я более внимательно посмотрел на реакцию погоды. Моя выборка предназначена для часового пояса Америки/Нью-Йорка с timezone_offset: -14400, если это полезно здесь. 14.09.2020

Ответы:


1

1600200000, вероятно, является значением времени в секундах с 1970-01-01, которое, если это было UTC, разрешается в 2020-09-15T20:00:00.000Z.

Смещение -14400, вероятно, также соответствует секундам, которое разрешается в -4:00. Таким образом, кажется, что 1600200000 — это значение местного времени для смещения -14400, которое соответствует текущему смещению в Нью-Йорке.

Учитывая отметку времени 2020-09-15T20:00:00 и смещение -14400, вы должны проанализировать строку как UTC, а затем настроить ее, используя смещение, чтобы получить дату, которую затем можно сравнить с другими датами.

E.g.

/** Parse timestamp as UTC and apply provided offset
 *  @param {string} timestamp - ISO 8601 format, no timezone
 *  @param {number} offset    - Offset from UTC in seconds
 *  @returns {Date} for timestamp and offset
 */
function parseISO(timestamp, offset) {
  // Get values from timestamp
  let [Y,M,D,H,m,s] = timestamp.split(/\D/);
  // Parse as if UTC
  let date = new Date(Date.UTC(Y, M-1, D, H, m, s));
  // Apply offset to adjust to actual UTC
  date.setUTCSeconds(date.getUTCSeconds() - offset);
  return date;  
}

let timestamp = '2020-09-15T20:00:00';
let offset = -14400;
let date = parseISO(timestamp, offset);

console.log('New York: ' + date.toLocaleString('default', {timeZone:'America/New_York'}));
console.log('UTC     : ' + date.toISOString());

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

14.09.2020
  • Я пытался применить вашу функцию, но у меня все еще есть проблемы. Как бы вы применили свою функцию parseISO для проверки на равенство с отметкой времени unix, с которой я ее сравниваю? Я предполагаю, что мне понадобится другая функция для анализа временных меток unix из hourlyForecast? 22.09.2020
  • и все - дайте мне знать, если я должен уточнить или сжать вопрос; рад переспросить в более чистом виде 22.09.2020
  • @elderlyman — если временная метка UNIX равна секундам, то new Date(unixTimestamp * 1000) дает вам эквивалентную дату ECMAScript. Сравните подальше. 23.09.2020
  • В конце концов, я думаю, что это был плохо заданный вопрос с моей стороны. Я попытался создать краткие тестовые данные из избытка реальных данных, и все запуталось. Но я многому научился, изучив ваш ответ! Спасибо 23.09.2020
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

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

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..