Projenin demosu : Demo
Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github
Amaç
Elimizde "4:58" gibi bir formatta videoların uzunlukları var. Bunların toplam uzunluğunu bulup "saat:dakika:saniye" cinsinden konsola basmamız gerekiyor.
Çözümüm
<script>
// video sürelerinin data-time attribute'unda belirtildiği elementleri seçelim
// burada her elemanın olduğu bir NodeList dönecektir ancak biz daha sonra
// bir Array metodu olan .map kullanacağımız için spread operatör ile Array'e dönüştürelim
const videoTimes = [...document.querySelectorAll('[data-time]')]
// her elementteki data-time attribute'undan video uzunluk değerini saniye cinsinden arrayde tutalım
const secondsList = videoTimes.map((video) => {
const [mins,seconds] = video.dataset.time.split(':')
// burada aldığımız dakika ve saniyeler string olduğundan onları 1 ile çarpıp numbera dönüştürelim
return +(mins * 60 + seconds * 1)
})
// artık elimizde her videonun saniye cinsinden uzunluğunun olduğu bir array var reduce ile toplam saniyeyi bulalım
const totalSeconds = secondsList.reduce((total,sec) => {
return total + sec
},0)
// videoların toplam saniyesi elimizde şimdi bunu saat:dakika:saniye cinsine çevirelim
// 1. Yol
// toplam saniyeyi let ile seconds değişkenine atayalım
let seconds = totalSeconds
// bu saniyede kaç saat olduğunu bulalım
const hours = Math.floor(seconds / 3600)
// saniyeden saat kadar kısmı çıkaralım
seconds = seconds % 3600
// kaç dakika ettiğini bulalım
const minutes = Math.floor(seconds / 60)
// kalan saniyeyi bulalım
seconds = seconds % 60
// sonucu konsola basalım
console.log(`${hours}:${minutes}:${seconds}`);
// 2. Yol
// saniyeyi Date'e çevirip Intl api sayesinde konsola basalım
const date = new Date(totalSeconds * 1000)
const formattedDate = new Intl.DateTimeFormat('tr-TR',{hour:'numeric',minute:'numeric',second:'numeric',timeZone:'UTC'}).format(date)
console.log(formattedDate);
// 3. Yol
// saniyeyi Date'e çevirip ISO stringine dönüştürüp hh:mm:ss cinsindeki değeri konsola basalım
const isoDate = new Date(totalSeconds * 1000).toISOString().slice(11,19)
console.log(isoDate);
</script>