मेरे पास दो सरणियाँ हैं जिनमें ऑब्जेक्ट हैं। एक ऐसा दिखता है:

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

डीटी और डेटाटाइम_लोकल को कवर करने के लिए मैं जिस स्वरूपण फ़ंक्शन का उपयोग कर रहा हूं वह इस तरह दिखता है

 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() एक खाली सरणी क्यों लौटा रहा है। क्या यह सिर्फ एक समय स्वरूपण मुद्दा है? धन्यवाद

1
elderlyman 12 सितंबर 2020, 23:45

1 उत्तर

सबसे बढ़िया उत्तर

"१६००२०००००" संभवतः १९७०-०१-०१ के बाद से सेकंड में एक समय मान है, जो अगर यूटीसी था, तो "२०२०-०९-१५टी२०:००:०००००जेड" का समाधान करता है।

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

ध्यान दें कि यदि आप एक ही दिन की घटनाओं की तुलना करना चाहते हैं, तो आपको अलग-अलग समय क्षेत्रों से निपटने के तरीके और "उसी दिन" का अर्थ निकालने की आवश्यकता हो सकती है।

1
RobG 14 सितंबर 2020, 07:04