मैं एक उपकरण के उपयोग को ट्रैक कर रहा हूं, और उपयोगकर्ताओं को घंटे के हिसाब से उनके उपयोग के रुझान दिखा रहा हूं। मूल रूप से, मुझे times दस्तावेज़ों को देखने और देखने की ज़रूरत है कि क्या डिवाइस 6 बजे और 7 बजे के बीच "चालू" था, फिर 7 बजे और 8 बजे, 8 बजे और 9 बजे, और इसी तरह सभी 24 घंटों के लिए।

मैंने मूल रूप से यही लिखा है:

      // loop through 24 hours of the day
      for (let j = 0; j < 24; j++) {
        const beginningOfHour = moment().startOf('day').add(j, 'hour').toDate()
        const endOfHour = moment(beginningOfHour).add({ m: 59, s: 59, ms: 999 }).toDate()

        const cumulativeHours = timePerPeriod(beginningOfHour, endOfHour, myTimes)  // calculation func

        trendsArray.push(cumulativeHours)
      }

यह काम नहीं करता क्योंकि beginningOfHour और endOfHour के साथ एक तारीख भी जुड़ी होती है।

मैं यह पता नहीं लगा सकता कि मेरे times दस्तावेज़ों को केवल घंटे के हिस्से के लिए, बिना किसी तारीख के संदर्भ के कैसे जांचा जाए। इसे कैसे करें इस पर कोई सलाह?

संपादित करें: यहाँ एक times दस्तावेज़ कैसा दिखता है:

_id: 5e56cf9ae65bf2b30a6ab525  // ObjectID type
user_id: 5e56bb2b40ad526200401773  // ObjectID type
start: 2020-02-27T00:00:00.000+00:00  // Date type
stop: 2020-02-27T06:00:00.000+00:00  // Date type

डिवाइस किसी भी समय के लिए चालू हो सकता है, जैसे 3 महीने सीधे या 15 सेकंड। प्रत्येक time दस्तावेज़ की जांच की जाती है, और यदि यह उस घंटे की अवधि के दौरान किसी भी समय के लिए चालू है, तो उस घंटे की अवधि के दौरान मिलीसेकंड में लंबाई मेरे गणना फ़ंक्शन (जिसे cumulativeHours कहा जाता है) द्वारा वापस कर दिया जाता है। ऊपर)।

2
Brian 2 मार्च 2020, 22:56
क्या डेटा में एक दिन से अधिक समय तक के ईवेंट हो सकते हैं? यदि हां, तो क्या वे संचयी हैं? उदा. यदि पिछले सप्ताह के लिए हर दिन मैंने अपना उपकरण रात 8:30 बजे चालू किया है, तो क्या यह 7 वापस आ जाना चाहिए? साथ ही, क्या आप उदाहरण डेटा प्रदान कर सकते हैं जो उसने myTimes चरों में प्रदान किया था?
 – 
blex
2 मार्च 2020, 23:04
1
मैंने अपना प्रश्न अधिक जानकारी के साथ संपादित किया।
 – 
Brian
2 मार्च 2020, 23:12
क्या आप 24 घंटे के समय को time नामक पूर्णांक में बदल सकते हैं और time > start && time < end का उपयोग कर सकते हैं?
 – 
Shaun E. Tobias
3 मार्च 2020, 00:02

3 जवाब

आप समय के माध्यम से पुनरावृति कर सकते हैं और इस तरह की वस्तुओं पर .hour() या .minute() विधियों का उपयोग करके दिन के घंटे और/या टाइमस्टैम्प के मिनट को फ़िल्टर कर सकते हैं (सरलता कारणों से मैं केवल जांच करता हूं घंटा):

let sampleArrayOfDateTimes = [
  moment("2013-02-08 08:59"),
  moment("2013-02-08 09:00"),
  moment("2013-02-08 09:30"),
  moment("2013-02-08 10:00")
]

// find datetimes between 09:00 (including) and 10:00 (excluding)

let arrayWithTimesBetween9and10 = sampleArrayOfDateTimes.filter(datetime => datetime.hour() == 9);

console.log("the following datetimes are between 09:00 and 09:59");
arrayWithTimesBetween9and10.forEach(datetime => {
  console.log(datetime.format());
});
<script src="https://unpkg.com/moment@2.24.0/moment.js"></script>
0
MattDiMu 2 मार्च 2020, 23:19
मैंने यही सोचा, लेकिन उन्होंने इस सवाल में विवरण जोड़ा। वह वास्तव में वह नहीं करना चाहता है
 – 
blex
2 मार्च 2020, 23:22

मोबाइल से पोस्टिंग। कृपया नीचे संलग्न छवि का पालन करें।

enter image description here

-1
Mr Khan 2 मार्च 2020, 23:17

जैसा कि प्रश्न संपादित किया गया था और अब एक दूसरे को ओवरलैप करते हुए समय सीमा के लिए पूछ रहा है, यहां संपादित संस्करण के लिए एक समाधान आता है। यह एक बहुत ही सरल दृष्टिकोण है, जो कई दिनों में मिनटों या समय-सीमा को ध्यान में नहीं रखता है, लेकिन यह आशा करता है कि यह विचार बताता है। मूल रूप से हर समय-संयोजन के लिए सभी 4 possibilites की जाँच करने की आवश्यकता होती है (समय अवधि पूरी तरह से ओवरलैप होती है, बिल्कुल ओवरलैप न करें या केवल प्रारंभ या केवल समाप्ति समय बीच में है):

let sampleDatetimeRanges = [
  {
    start: moment("2013-02-08 09:00"),
    end: moment("2013-02-08 10:00")
  },
  {
    start: moment("2013-02-08 08:00"),
    end: moment("2013-02-08 12:00")
  },
  {
    start: moment("2013-02-08 13:00"),
    end: moment("2013-02-08 18:00")
  } 
];

function isBetweenHours(start, end, hourInQuestion) {
  return start <= hourInQuestion && end >= hourInQuestion;
}


// calculate the timespan between 09:00 and 10:00
const rangeStart = 9;
const rangeEnd = 11;
const hoursCount = sampleDatetimeRanges.map(current => {
  let startHour = current.start.hour();
  let endHour = current.end.hour();
  if (startHour <= rangeStart && endHour >= rangeEnd) { // full time covered
    return rangeEnd - rangeStart;
  } else if (startHour <= rangeStart && isBetweenHours(rangeStart, rangeEnd, endHour)) { // only end time in timespan
    return endHour - rangeStart;
  } else if (isBetweenHours(rangeStart, rangeEnd, startHour) && endHour >= rangeEnd) { // only start time in timespan
    return rangeEnd - startHour;
  } else if (isBetweenHours(rangeStart, rangeEnd, startHour) && isBetweenHours(rangeStart, rangeEnd, endHour)) {
    return endHour - startHour;
  }
  // not in timespan
  return 0;

}).reduce((sum, current) => sum + current, 0)

console.log(`hours covered in the timespan from ${rangeStart} to ${rangeEnd}: ${hoursCount}. `);
<script src="https://unpkg.com/moment@2.24.0/moment.js"></script>
0
MattDiMu 2 मार्च 2020, 23:57
let startHour = current.start.hour(); आपके पास यह लाइन कमोबेश मेरी जरूरत की चीज है, लेकिन .hour() जावास्क्रिप्ट डेट ऑब्जेक्ट्स के लिए मान्य तरीका नहीं है। और getTime() विधि यूनिक्स टाइमस्टैम्प लौटाती है, जो कि मुझे या तो नहीं चाहिए।
 – 
Brian
3 मार्च 2020, 00:14
इसे पलजे-ऑब्जेक्ट्स में कनवर्ट/पार्स क्यों न करें जैसे मैंने किया था? आपने अपने प्रश्न में मोमेंटज को टैग के रूप में जोड़ा है।
 – 
MattDiMu
3 मार्च 2020, 01:47