異なるオブジェクトからの2つの日付値を比較し、それらをフォーマットして、等しいかどうかをテストするにはどうすればよいですか?

老人

オブジェクトを含む2つの配列があります。1つは次のようになります。

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()が空の配列を返す理由を理解したいと思います。それは単なる時間フォーマットの問題ですか?ありがとう

RobG

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

同じ日のイベントを比較する場合は、異なるタイムゾーンの処理方法と「同じ日」の意味を理解する必要がある場合があることに注意してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ