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.
Saatlerinizi bir zaman çizelgesine yazmayı denediniz, ancak patronunuz tüm bu solunumla oldukça meşgul. Ya matematiği doğru yapmamışlarsa ve çalışma saatlerinizi yanlış eklemişlerse?
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`;
Her satırda bir tarih ve ardından bazı zaman aralıkları bulunur. Ancak çok net bir şekilde yazılmamışlar; bazı aralıklar virgülle ayrılmış, diğerleri ise düzensiz aralıklara sahip, vb.
Bu tutarsızlıklar göz önüne alındığında, başka hiçbir garantinin olmadığını varsaymak muhtemelen iyidir. Mesela kim tüm zamanların aynı yıla ait olacağını söylüyor? Hiç kimse, o kim. Saatleri olabildiğince sağlam bir şekilde birbirine eklemek istiyorsunuz.
Bu oldukça kolaydır. Birkaç normal ifade ve bir yardımcı işlev oluşturarak başlıyoruz. O zaman biz sadece... Huuuuffh!
Ah!! Patron, git bir saniyeliğine bir yerlerde sakinleş!
Dediğim gibi artık üç adımlı bir algoritma ile görevi tamamlayabiliriz:
Zaman çizelgesi dizesini tek tek satırlara bölüyoruz ve bir nesne dizisi oluşturmak için bunları azaltıyoruz
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 },
Bir nesne dizisi oluşturmanın, zaman aralıklarını basitçe çıkarıp eklemeye göre birkaç belirgin avantajı vardır.
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.Bu çözüm mükemmel değil:
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.