如何比较来自不同对象的两个日期值,设置它们的格式并测试是否相等?

问题描述

我有两个包含对象的数组。一个看起来像这样:

%a=5;
aa bbbb  

一个像这样:

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

我想创建一个函数,该函数可查看数组中的对象,找出对象中的时间值是否相同,如果相同,则从具有匹配时间的对象中返回数据。稍后,我将使用HTML显示数据。

这里的最终目标是使用事件开始时的天气数据制作事件数据的html表。这些对象是从提取返回的响应。

这是我想找到匹配项的功能

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

我用来覆盖dt和datetime_local的格式化功能看起来像这样

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));

我想了解为什么我的getDataTodisplay()返回一个空数组。这只是时间格式问题吗?谢谢

解决方法

“ 1600200000”可能是从1970-01-01开始的时间值(以秒为单位),如果它是UTC,则解析为“ 2020-09-15T20:00:00.000Z”。

-14400的偏移量也可能是秒,它可以解析为-4:00。因此,似乎“ 1600200000”是偏移量-14400的本地时间值,该值与纽约州的当前偏移量匹配。

鉴于时间戳为“ 2020-09-15T20:00:00”且偏移量为-14400,您应将字符串解析为UTC,然后使用偏移量对其进行调整,以获取一个可以与其他日期进行比较的日期

例如

/** 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,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());

请注意,如果您想比较同一天的事件,则可能需要弄清楚如何处理不同的时区以及“同一天”的含义。