【问题标题】:How do I compare two date values from different objects, format them, and test for equality?如何比较来自不同对象的两个日期值、格式化它们并测试是否相等?
【发布时间】:2020-09-12 20:45:08
【问题描述】:

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

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 表。对象是从 fetch 返回的响应。

这是我想出的查找匹配项的函数:

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”),这是一个独特的时间点。您希望如何处理第一个时间戳?
  • 不要使用内置解析器。 "2020-09-15T20:00:00" 应该被视为本地,但 Safari 将其视为 UTC。
  • 谢谢@RobG。我希望如何处理第一个时间戳?我是从处理第一个时间戳还是第二个时间戳开始是任意的。我认为我的主要问题是我只是不知道如何在 vanilla js 中将 Unix 与 UTC 进行比较。 (在这种情况下,我受香草的约束)
  • @RobG 感谢您让我了解 Safari 的内置解析器。目前正在使用 Chrome。将记录处理这两种浏览器。
  • @RobG 我更仔细地查看了天气响应。我的获取是针对美国/纽约时区的,如果在这里有用的话,timezone_offset: -14400

标签: javascript datetime for-loop object


【解决方案1】:

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

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

【讨论】:

  • 我已尝试应用您的功能,但仍然遇到一些问题。您将如何应用您的函数 parseISO 来测试与我正在比较的 unix 时间戳是否相等?我假设我需要另一个函数来解析来自hourlyForecast的unix时间戳?
  • 和所有 - 让我知道我是否应该澄清或浓缩这个问题;很高兴以更简洁的方式重新提问
  • @elderlyman — 假设 UNIX 时间戳是秒,那么 new Date(unixTimestamp * 1000) 会为您提供等效的 ECMAScript 日期。比较一下。
  • 最后,我认为这是我提出的一个不好的问题。我试图从过多的真实数据中建立简洁的测试数据,结果变得一团糟。但是我从研究您的答案中学到了很多东西!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多