paint-brush
JavaScript'e Zaman Aralıklarını Kolay Bir Şekilde Eklemeile@anwarhjg
736 okumalar
736 okumalar

JavaScript'e Zaman Aralıklarını Kolay Bir Şekilde Ekleme

ile AHJ George4m2024/01/13
Read on Terminal Reader

Çok uzun; Okumak

Bir zaman çizelgeniz String'iniz, gezinen bir patronunuz ve JavaScript'iniz var. Sorun: Saatleri birbirine eklemek ve patronunuzun ortalıkta dolaşmasını durdurmak istiyorsunuz. Çözüm: Büyücülük gerektirmez.
featured image - JavaScript'e Zaman Aralıklarını Kolay Bir Şekilde Ekleme
AHJ George HackerNoon profile picture
0-item

Bu eğitimi tamamlamak için bu büyücülük malzemelerinin hiçbirine ihtiyacınız olmayacak. Yazarın resmi.



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:


  1. Zaman çizelgesi dizesini tek tek satırlara bölüyoruz ve bir nesne dizisi oluşturmak için bunları azaltıyoruz


  2. 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


  3. 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 olarak totalHours ve times 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.