मैं एक उपकरण के उपयोग को ट्रैक कर रहा हूं, और उपयोगकर्ताओं को घंटे के हिसाब से उनके उपयोग के रुझान दिखा रहा हूं। मूल रूप से, मुझे 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
कहा जाता है) द्वारा वापस कर दिया जाता है। ऊपर)।
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>
मोबाइल से पोस्टिंग। कृपया नीचे संलग्न छवि का पालन करें।
जैसा कि प्रश्न संपादित किया गया था और अब एक दूसरे को ओवरलैप करते हुए समय सीमा के लिए पूछ रहा है, यहां संपादित संस्करण के लिए एक समाधान आता है। यह एक बहुत ही सरल दृष्टिकोण है, जो कई दिनों में मिनटों या समय-सीमा को ध्यान में नहीं रखता है, लेकिन यह आशा करता है कि यह विचार बताता है। मूल रूप से हर समय-संयोजन के लिए सभी 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>
let startHour = current.start.hour();
आपके पास यह लाइन कमोबेश मेरी जरूरत की चीज है, लेकिन .hour() जावास्क्रिप्ट डेट ऑब्जेक्ट्स के लिए मान्य तरीका नहीं है। और getTime() विधि यूनिक्स टाइमस्टैम्प लौटाती है, जो कि मुझे या तो नहीं चाहिए।
myTimes
चरों में प्रदान किया था?time
नामक पूर्णांक में बदल सकते हैं औरtime > start && time < end
का उपयोग कर सकते हैं?