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 .
Sorun
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.
Çözüm
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ünB.
intervalsRegex
kullanarak tüm zaman aralığı aralıklarını toplayınC.
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 },
Bu Yöntemin Faydaları
Bir nesne dizisi oluşturmanın, zaman aralıklarını basitçe çıkarıp eklemeye göre birkaç belirgin avantajı vardır.
- Gerçekleştikten sonra kolay geçiş sağlar. Günlük zamanlarınızın grafiğini çizmek gibi bir şey yapmak istiyorsanız bu idealdir.
- Her kayıt için tarih dizesinin kaydedilmesi,
Date.parse
çağrısının ardından yerleşik JS tarih aritmetik yöntemlerinin kullanılmasına olanak tanır.
- Nesne,
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 Yöntemin Dezavantajları
Bu çözüm mükemmel değil:
- Bu, iki büyük geçiş gerektirir; bir kez zaman çizelgesini bölmenin sonucu üzerinde ve bir kez de
times
nesnesi üzerinde. Bu kodu optimize etmek için, alanlar olaraktotalHours
vetimes
içeren boş bir nesne üzerinde tek bir azaltma kullanmak muhtemelen daha iyi olacaktır.
- Daha karmaşık bir formatla daha da karmaşık hale gelebilecek düzenli ifadeler kullanır
Kapanış
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.