Soğuk bir gerginlik omurganızdan aşağıya doğru ilerliyor. Huuuff. 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. Haaaaah. Ş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 içeriğine benzeyen bir zaman çizelgeniz var: String 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. kullanarak yearRegex 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); ifadesinde, aşağıdaki gibi nesneleri içeren bir dizi göreceksiniz: console.log(times); { 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, çağrısının ardından yerleşik JS tarih aritmetik yöntemlerinin kullanılmasına olanak tanır. Date.parse Nesne, ç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. String.prototype.split 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 nesnesi üzerinde. Bu kodu optimize etmek için, alanlar olarak ve içeren boş bir nesne üzerinde tek bir azaltma kullanmak muhtemelen daha iyi olacaktır. times totalHours times 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.