Huuuff. Soğuk bir gerginlik omurganızdan aşağıya doğru ilerliyor.
Haaaaah. Patronunuzun soğuk nefesi, taşan bir lağım gibi boynunuza akıyor. Ama onlara başka bir yere gitmelerini söyleyemezsiniz... Ofisin zaman takip sistemi bozulduğundan beri sizi şahin gibi izliyorlar.
Şimdi oradalar... havada duruyorlar... nefes alıyorlar. Huffffff.
JavaScript ile işleri nasıl kendi elinize alacağınızı burada bulabilirsiniz. Haaaa .
Bu String
içeriğine benzeyen bir zaman çizelgeniz var:
const a = `November 30 2023 13:20-15:00, 15:30-16:40 December 4 2023 15:45-16:15, December 5 2023 08:00-08:30, 18:15-19:30, 21:45-22:15, 22:30-23:00 December 6 2023 19:45-21:45 December 7 2023 14:15-14:45, 15:15-15:45, 16:00-16:30, 16:45-17:15, 18:45-20:15, 20:45-22:45 December 13 2023 03:00-03:50 December 15 2023 09:00-09:30 20:30-21:15 21:45-22:30 23:30-24:00 December 16 2023 23:25-23:55 December 17 2023 19:05-19:50 20:30-21:30 22:15-23:45 December 20 2023 23:30-24:00 December 21 2023 02:20-2:50 03:15-03:30 13:40-14:00 16:00-17:15 17:45-18:45 19:20-20:10 21:30-22:20 23:00 - 24:00 December 22 2023 0:00-0:15`;
Bu oldukça kolaydır. Birkaç normal ifade ve bir yardımcı işlev oluşturarak başlıyoruz. O zaman biz sadece... Huuuuffh!
Zaman çizelgesi dizesini tek tek satırlara bölüyoruz ve bir nesne dizisi oluşturmak için bunları
Her yineleme için şunları yaparız:
A. yearRegex
kullanarak tarih dizesini kaydederek satırı yılın çevresine bölün
B. intervalsRegex
kullanarak tüm zaman aralığı aralıklarını toplayın
C. parseDate
yardımcısını ve 2.A adımındaki tarih dizesini kullanarak her birini bir JavaScript Date nesnesi olarak ayrıştırarak zaman aralıklarını azaltın
Toplam saati bulmak için nesne dizisini azaltın
const yearRegex = /(\d{4})/gi; const intervalsRegex = /(\d+\:\d+)\s*-\s*(\d+\:\d+)/gi; const parseDate = (date, time) => Date.parse(`${date} ${time}`); let times = [...a.split("\n")].reduce((arr, entryLine) => { let entryLineSplit = entryLine.split(yearRegex); let o = { date: entryLineSplit[0] + entryLineSplit[1], timeRanges: [...entryLine.matchAll(intervalsRegex)], }; o.hoursForDay = o.timeRanges.reduce((total, [x, start, end]) => { let s = parseDate(o.date, start); let e = parseDate(o.date, end); return total + (e - s) / 1000 / 60 / 60; }, 0); return [...arr, o]; }, []); console.log(times); let totalHours = times.reduce((total, { hoursForDay }) => total + hoursForDay, 0); console.log(totalHours);
console.log(times);
ifadesinde, aşağıdaki gibi nesneleri içeren bir dizi göreceksiniz:
{ date: 'November 30 2023', timeRanges: [ [ '13:20-15:00', '13:20', '15:00', index: 17, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ], [ '15:30-16:40', '15:30', '16:40', index: 30, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ] ], totalHours: 2.8333333333333335 },
Date.parse
çağrısının ardından yerleşik JS tarih aritmetik yöntemlerinin kullanılmasına olanak tanır.
String.prototype.split
çağrısının sonuçlarını depolamak için uygun bir yerdir; bu, iki günün aynı zaman aralıklarını içerip içermediğine bağlı olarak benzersiz olmayabilir.times
nesnesi üzerinde. Bu kodu optimize etmek için, alanlar olarak totalHours
ve times
içeren boş bir nesne üzerinde tek bir azaltma kullanmak muhtemelen daha iyi olacaktır.
Artık dağınık bir zaman çizelgesinden zamanı nasıl çıkaracağınızı biliyorsunuz. Biraz ekstra çabayla tam zamanlı çalışan bir saat bile oluşturabilirsiniz. Ama o zaman bu kadar kaliteli zamanı patronunu tanımak için harcayamazsın, değil mi? Huffff.