HH-MM-SS
JavaScript kullanarak saniyeleri bir dizeye nasıl dönüştürebilirim ?
HH-MM-SS
JavaScript kullanarak saniyeleri bir dizeye nasıl dönüştürebilirim ?
Yanıtlar:
Datejs bilmiyor musun ? bilmeli bir zorunluluktur.
Datejs kullanarak sadece şöyle bir şey yazın:
(new Date).clearTime()
.addSeconds(15457)
.toString('H:mm:ss');
--Güncelleme
Günümüzde date.js eski ve bakımsız, bu nedenle TJ Crowder tarafından işaret edildiği gibi daha iyi olan " Moment.js " kullanın .
- güncelleme 2
Lütfen @ Frank'in tek satırlık bir çözümünü kullanın:
new Date(SECONDS * 1000).toISOString().substr(11, 8)
Bu en iyi çözüm.
TypeError: Object [object Date] has no method 'clearTime'
.
Bunu, aşağıdaki gibi JavaScript Tarihi yönteminin yardımıyla harici bir JavaScript kitaplığı olmadan yapmayı başarabilirsiniz:
var date = new Date(null);
date.setSeconds(SECONDS); // specify value for SECONDS here
var result = date.toISOString().substr(11, 8);
Ya da @Frank'in yorumuna göre; bir astar:
new Date(SECONDS * 1000).toISOString().substr(11, 8);
new Date(SECONDS * 1000).toISOString().substr(11, 8);
Object doesn't support property or method 'toISOString'
Standart Date nesnesinin herhangi bir yerleşik özelliğinin bunu sizin için sadece matematiği kendiniz yapmaktan daha uygun bir şekilde yapacağını düşünmüyorum.
hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
minutes = Math.floor(totalSeconds / 60);
seconds = totalSeconds % 60;
Misal:
0.05
içinde hours
değişken. Davam için parseInt
sabit bir içine koydum , ama her şey için doğru olacağını düşünmüyorum. Yine de, bu bana yardımcı oldu, çok teşekkürler!
parseInt
bunun için kullanmak istemezsiniz , bu sayıları manipüle etmek değil, dizeleri ayrıştırmak içindir . Math.floor
burada ilgili operasyon olurdu.
seconds = Math.floor(totalSeconds % 60);
. Orada da ondalık bir sonuç aldım.
totalSeconds % 60
sadece kesirli bir kısmı varsa totalSeconds
kesirli bir kısmı olabilir. Katlamak isteyip istemediğiniz, bu bilgileri kaybetmek veya tutmak isteyip istemediğinize bağlı olacaktır. (Yaptığımız diğer kat operasyonları hiçbir bilgiyi kaybetmez, çünkü sadece minutes
ve sonunda olacak verileri temizlerler seconds
.)
console.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Bunun biraz eski olduğunu biliyorum, ama ...
ES2015:
var toHHMMSS = (secs) => {
var sec_num = parseInt(secs, 10)
var hours = Math.floor(sec_num / 3600)
var minutes = Math.floor(sec_num / 60) % 60
var seconds = sec_num % 60
return [hours,minutes,seconds]
.map(v => v < 10 ? "0" + v : v)
.filter((v,i) => v !== "00" || i > 0)
.join(":")
}
Çıktı verecektir:
toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18
Cleiton'un cevabında belirttiği gibi , moment.js bunun için kullanılabilir:
moment().startOf('day')
.seconds(15457)
.format('H:mm:ss');
moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss')
.
.format('YYYY DDD HH:mm:ss')
function formatSeconds(seconds)
{
var date = new Date(1970,0,1);
date.setSeconds(seconds);
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}
var timeInSec = "661"; //even it can be string
String.prototype.toHHMMSS = function () {
/* extend the String by using prototypical inheritance */
var seconds = parseInt(this, 10); // don't forget the second param
var hours = Math.floor(seconds / 3600);
var minutes = Math.floor((seconds - (hours * 3600)) / 60);
seconds = seconds - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
var time = hours+':'+minutes+':'+seconds;
return time;
}
alert("5678".toHHMMSS()); // "01:34:38"
console.log(timeInSec.toHHMMSS()); //"00:11:01"
bu fonksiyonu çok daha kısa ve net yapabiliriz, ancak bu okunabilirliği azaltır, bu yüzden mümkün olduğunca basit ve mümkün olduğunca kararlı yazacağız.
veya bu çalışmayı buradan kontrol edebilirsiniz :
İşte Number sınıfının bir uzantısı. toHHMMSS (), saniyeleri ss: dd: ss dizgisine dönüştürür.
Number.prototype.toHHMMSS = function() {
var hours = Math.floor(this / 3600) < 10 ? ("00" + Math.floor(this / 3600)).slice(-2) : Math.floor(this / 3600);
var minutes = ("00" + Math.floor((this % 3600) / 60)).slice(-2);
var seconds = ("00" + (this % 3600) % 60).slice(-2);
return hours + ":" + minutes + ":" + seconds;
}
// Usage: [number variable].toHHMMSS();
// Here is a simple test
var totalseconds = 1234;
document.getElementById("timespan").innerHTML = totalseconds.toHHMMSS();
// HTML of the test
<div id="timespan"></div>
Noobiler için takip edilmesi kolay sürüm:
var totalNumberOfSeconds = YOURNUMBEROFSECONDS;
var hours = parseInt( totalNumberOfSeconds / 3600 );
var minutes = parseInt( (totalNumberOfSeconds - (hours * 3600)) / 60 );
var seconds = Math.floor((totalNumberOfSeconds - ((hours * 3600) + (minutes * 60))));
var result = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);
console.log(result);
Bu işlev bunu yapmalıdır:
var convertTime = function (input, separator) {
var pad = function(input) {return input < 10 ? "0" + input : input;};
return [
pad(Math.floor(input / 3600)),
pad(Math.floor(input % 3600 / 60)),
pad(Math.floor(input % 60)),
].join(typeof separator !== 'undefined' ? separator : ':' );
}
Bir ayırıcıyı geçmeden :
, (varsayılan) ayırıcı olarak kullanır :
time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51
-
Ayırıcı olarak kullanmak istiyorsanız , ikinci parametre olarak iletmeniz yeterlidir:
time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46
Ayrıca bkz bu Fiddle .
:
, separator
parametre için zaten varsayılan olarak ayarlanmış . Bu açıklama tarafından yapılır typeof separator !== 'undefined' ? separator : ':'
. Ayrıca, fonksiyonunuz benim bazı kozmetik değişiklikleri kaydetmek için hemen hemen aynıdır ve her ikisi de aynı çıktıyı üretmelidir ... benim sürümüm çok daha iyi tarayıcı desteğine sahip. Sizinki, Internet Explorer veya MS Edge <14'ün HERHANGİ bir sürümünde çalışmaz
saniyeleri ss-dd-ss biçimine dönüştürecek verilen kod aşağıdadır:
var measuredTime = new Date(null);
measuredTime.setSeconds(4995); // specify value of SECONDS
var MHSTime = measuredTime.toISOString().substr(11, 8);
JavaScript'te saniyeleri HH-MM-SS biçimine dönüştürme yönteminden alternatif yöntem edinin
Milisaniye belirtmek için FFMPEG tarafından kullanılan özel HH: MM: SS.MS (eq: "00: 04: 33.637") durumunda .
[-] [SS:] DD: SS [.m ...]
HH saat sayısını, MM maksimum 2 hane için dakika sayısını ve SS maksimum 2 hane için saniye sayısını ifade eder. Sondaki m SS için ondalık değeri ifade eder.
/* HH:MM:SS.MS to (FLOAT)seconds ---------------*/
function timerToSec(timer){
let vtimer = timer.split(":")
let vhours = +vtimer[0]
let vminutes = +vtimer[1]
let vseconds = parseFloat(vtimer[2])
return vhours * 3600 + vminutes * 60 + vseconds
}
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
/* Example: 7hours, 4 minutes, 33 seconds and 637 milliseconds */
const t = "07:04:33.637"
console.log(
t + " => " +
timerToSec(t) +
"s"
)
/* Test: 25473 seconds and 637 milliseconds */
const s = 25473.637 // "25473.637"
console.log(
s + "s => " +
secToTimer(s)
)
Örnek kullanım, milisaniye aktarım zamanlayıcısı:
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
let job, origin = new Date().getTime()
const timer = () => {
job = requestAnimationFrame(timer)
OUT.textContent = secToTimer((new Date().getTime() - origin) / 1000)
}
requestAnimationFrame(timer)
span {font-size:4rem}
<span id="OUT"></span>
<br>
<button onclick="origin = new Date().getTime()">RESET</button>
<button onclick="requestAnimationFrame(timer)">RESTART</button>
<button onclick="cancelAnimationFrame(job)">STOP</button>
Bir medya öğesine bağlı örnek kullanım
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
VIDEO.addEventListener("timeupdate", function(e){
OUT.textContent = secToTimer(e.target.currentTime)
}, false)
span {font-size:4rem}
<span id="OUT"></span><br>
<video id="VIDEO" width="400" controls autoplay>
<source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
</video>
Sorunun dışında, php ile yazılmış bu fonksiyonlar:
<?php
/* HH:MM:SS to (FLOAT)seconds ------------------*/
function timerToSec($timer){
$vtimer = explode(":",$timer);
$vhours = (int)$vtimer[0];
$vminutes = (int)$vtimer[1];
$vseconds = (float)$vtimer[2];
return $vhours * 3600 + $vminutes * 60 + $vseconds;
}
/* Seconds to (STRING)HH:MM:SS -----------------*/
function secToTimer($sec){
return explode(" ", date("H:i:s", $sec))[0];
}
+ "." + p.getMilliseconds()
Sadece kullanarak new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
var time1 = date1.getTime();
var time2 = date2.getTime();
var totalMilisec = time2 - time1;
alert(DateFormat('hh:mm:ss',new Date(totalMilisec)))
/* ----------------------------------------------------------
* Field | Full Form | Short Form
* -------------|--------------------|-----------------------
* Year | yyyy (4 digits) | yy (2 digits)
* Month | MMM (abbr.) | MM (2 digits)
| NNN (name) |
* Day of Month | dd (2 digits) |
* Day of Week | EE (name) | E (abbr)
* Hour (1-12) | hh (2 digits) |
* Minute | mm (2 digits) |
* Second | ss (2 digits) |
* ----------------------------------------------------------
*/
function DateFormat(formatString,date){
if (typeof date=='undefined'){
var DateToFormat=new Date();
}
else{
var DateToFormat=date;
}
var DAY = DateToFormat.getDate();
var DAYidx = DateToFormat.getDay();
var MONTH = DateToFormat.getMonth()+1;
var MONTHidx = DateToFormat.getMonth();
var YEAR = DateToFormat.getYear();
var FULL_YEAR = DateToFormat.getFullYear();
var HOUR = DateToFormat.getHours();
var MINUTES = DateToFormat.getMinutes();
var SECONDS = DateToFormat.getSeconds();
var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var arrDay=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var strMONTH;
var strDAY;
var strHOUR;
var strMINUTES;
var strSECONDS;
var Separator;
if(parseInt(MONTH)< 10 && MONTH.toString().length < 2)
strMONTH = "0" + MONTH;
else
strMONTH=MONTH;
if(parseInt(DAY)< 10 && DAY.toString().length < 2)
strDAY = "0" + DAY;
else
strDAY=DAY;
if(parseInt(HOUR)< 10 && HOUR.toString().length < 2)
strHOUR = "0" + HOUR;
else
strHOUR=HOUR;
if(parseInt(MINUTES)< 10 && MINUTES.toString().length < 2)
strMINUTES = "0" + MINUTES;
else
strMINUTES=MINUTES;
if(parseInt(SECONDS)< 10 && SECONDS.toString().length < 2)
strSECONDS = "0" + SECONDS;
else
strSECONDS=SECONDS;
switch (formatString){
case "hh:mm:ss":
return strHOUR + ':' + strMINUTES + ':' + strSECONDS;
break;
//More cases to meet your requirements.
}
}
Yukarıdaki güzel cevaba biraz açıklama yapmak istedim:
var totalSec = new Date().getTime() / 1000;
var hours = parseInt( totalSec / 3600 ) % 24;
var minutes = parseInt( totalSec / 60 ) % 60;
var seconds = totalSec % 60;
var result = (hours < 10 ? "0" + hours : hours) + "-" + (minutes < 10 ? "0" + minutes : minutes) + "-" + (seconds < 10 ? "0" + seconds : seconds);
İkinci satırda, 1 saatte 3600 saniye olduğu için, toplam saat sayısını elde etmek için toplam saniye sayısını 3600'e böleriz. Herhangi bir ondalık işareti ayırmak için parseInt kullanıyoruz. TotalSec 12600 (3 buçuk saat) olsaydı, 3 tam saatimiz olacağından parseInt (totalSec / 3600) 3 döndürür. Bu durumda neden% 24'e ihtiyacımız var? 24 saati aşarsak, diyelim ki 25 saatimiz (90000 saniye) var, o zaman buradaki modülo 25'i döndürmek yerine bizi tekrar 1'e götürecektir. 24 saat olduğundan sonucu 24 saat sınırı içinde sınırlandırıyor bir gün içinde.
Böyle bir şey gördüğünüzde:
25 % 24
Şöyle düşünün:
25 mod 24 or what is the remainder when we divide 25 by 24
Bu eski iş parçacığına girerken - OP, HH: MM: SS'yi belirtti ve çözümlerin birçoğu, listelenen 24 saatten daha fazlasına ihtiyacınız olduğunu fark edene kadar çalışıyor. Ve belki de tek bir kod satırından fazlasını istemezsiniz. Hadi bakalım:
d=(s)=>{f=Math.floor;g=(n)=>('00'+n).slice(-2);return f(s/3600)+':'+g(f(s/60)%60)+':'+g(s%60)}
H +: MM: SS değerini döndürür. Kullanmak için şunu kullanın:
d(91260); // returns "25:21:00"
d(960); // returns "0:16:00"
... güzel, tek katmanlı bir yaklaşım için mümkün olan en az miktarda kodu kullanmaya çalıştım.
Bir Date nesnesine saniye eklemeyi denediniz mi?
var dt = new Date();
dt.addSeconds(1234);
Bir örnek: https://jsfiddle.net/j5g2p0dc/5/
Güncellendi: Örnek bağlantı eksik, bu yüzden yeni bir tane oluşturdum.
addSeconds
Date nesnesinde özel yöntem kullandığınızı serbest bırakmadım Date.prototype.addSeconds = function(seconds){...}
. Evet, işe yarıyor, güncelleme için teşekkürler.
Burada powtac'ın cevabını temel alarak saniyeleri ss-dd-ss biçimine dönüştüren bir işlev var
/**
* Convert seconds to hh-mm-ss format.
* @param {number} totalSeconds - the total seconds to convert to hh- mm-ss
**/
var SecondsTohhmmss = function(totalSeconds) {
var hours = Math.floor(totalSeconds / 3600);
var minutes = Math.floor((totalSeconds - (hours * 3600)) / 60);
var seconds = totalSeconds - (hours * 3600) - (minutes * 60);
// round seconds
seconds = Math.round(seconds * 100) / 100
var result = (hours < 10 ? "0" + hours : hours);
result += "-" + (minutes < 10 ? "0" + minutes : minutes);
result += "-" + (seconds < 10 ? "0" + seconds : seconds);
return result;
}
Örnek kullanım
var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10
Tüm cevaplara baktıktan ve çoğundan memnun kaldıktan sonra, bu benim ortaya çıktığım şeydi. Sohbete çok geç kaldığımı biliyorum, ama işte zaten.
function secsToTime(secs){
var time = new Date();
// create Date object and set to today's date and time
time.setHours(parseInt(secs/3600) % 24);
time.setMinutes(parseInt(secs/60) % 60);
time.setSeconds(parseInt(secs%60));
time = time.toTimeString().split(" ")[0];
// time.toString() = "HH:mm:ss GMT-0800 (PST)"
// time.toString().split(" ") = ["HH:mm:ss", "GMT-0800", "(PST)"]
// time.toTimeString().split(" ")[0]; = "HH:mm:ss"
return time;
}
Yeni bir Date nesnesi oluşturuyorum, zamanı parametrelerime değiştiriyorum, Date Object'i bir zaman dizesine dönüştürdüm ve dizeyi bölerek ve yalnızca gereken kısmı döndürerek ek şeyleri kaldırdım.
Bu yaklaşımı paylaşacağımı düşündüm, çünkü sonuçları "HH: mm: ss" biçiminde almak için normal ifade, mantık ve matematik akrobasi ihtiyacını ortadan kaldırır ve bunun yerine yerleşik yöntemlere dayanır.
Buradaki belgelere göz atmak isteyebilirsiniz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Bu sorunu çözmek için birçok seçenek var ve önerilen iyi bir seçenek var.
function formatSeconds(sec) {
return [(sec / 3600), ((sec % 3600) / 60), ((sec % 3600) % 60)]
.map(v => v < 10 ? "0" + parseInt(v) : parseInt(v))
.filter((i, j) => i !== "00" || j > 0)
.join(":");
}
10'dan az sayı ile biçimlendirilmiş sıfır istemiyorsanız,
function formatSeconds(sec) {
return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);
}
Örnek Kod http://fiddly.org/1c476/1
Bir satırda TJ Crowder'ın çözümünü kullanarak:
secToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`
Bir satırda, günleri de sayan başka bir çözüm:
secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`
Kaynak: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276
Aşağıdaki kodu da kullanabilirsiniz:
int ss = nDur%60;
nDur = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
new Date().toString().split(" ")[4];
sonuç 15:08:03
AngularJS kullanan herkes için basit bir çözüm, değeri milisaniyeyi istenen biçime göre bir dizeye dönüştüren tarih API'siyle filtrelemektir . Misal:
<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div>
Bunun milisaniye beklediğini unutmayın, bu nedenle saniyelerden dönüştürüyorsanız (orijinal soru formüle edildiği gibi) timeRemaining'i 1000 ile çarpmak isteyebilirsiniz.
Bazılarının saniye sayısının bir günden fazla olduğu sözünü ettim. İşte @Harish Anchu'nun daha uzun süre açıklayan en yüksek puanlı yanıtının uyarlanmış bir sürümü:
function secondsToTime(seconds) {
const arr = new Date(seconds * 1000).toISOString().substr(11, 8).split(':');
const days = Math.floor(seconds / 86400);
arr[0] = parseInt(arr[0], 10) + days * 24;
return arr.join(':');
}
Misal:
secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'
String.prototype.toHHMMSS = function () {
var sec_num = parseInt(this, 10); // don't forget the second param
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+':'+minutes+':'+seconds;
}
Kullanım Örneği
alert("186".toHHMMSS());
Buradaki cevapların hiçbiri gereksinimlerimi karşılamıyor çünkü ele alabilmek istiyorum
Her ne kadar OP tarafından gerekli olmasa da, özellikle az çaba sarf ettiğinde, kenar vakaları kapsamak iyi bir uygulamadır.
Onun söylediği zaman OP saniyelik bir NUMARASI anlamına gelmesidir çok bariz saniye . Neden fonksiyonunuzu sabitleyesiniz String
?
function secondsToTimeSpan(seconds) {
const value = Math.abs(seconds);
const days = Math.floor(value / 1440);
const hours = Math.floor((value - (days * 1440)) / 3600);
const min = Math.floor((value - (days * 1440) - (hours * 3600)) / 60);
const sec = value - (days * 1440) - (hours * 3600) - (min * 60);
return `${seconds < 0 ? '-':''}${days > 0 ? days + '.':''}${hours < 10 ? '0' + hours:hours}:${min < 10 ? '0' + min:min}:${sec < 10 ? '0' + sec:sec}`
}
secondsToTimeSpan(0); // => 00:00:00
secondsToTimeSpan(1); // => 00:00:01
secondsToTimeSpan(1440); // => 1.00:00:00
secondsToTimeSpan(-1440); // => -1.00:00:00
secondsToTimeSpan(-1); // => -00:00:01
secondsToTimeSpan(8991)
geri 6.00:05:51
dönmek gerektiğini düşünüyorum iken döner00:02:29:51
Bu kodu daha önce basit bir zaman aralığı nesnesi oluşturmak için kullandım:
function TimeSpan(time) {
this.hours = 0;
this.minutes = 0;
this.seconds = 0;
while(time >= 3600)
{
this.hours++;
time -= 3600;
}
while(time >= 60)
{
this.minutes++;
time -= 60;
}
this.seconds = time;
}
var timespan = new Timespan(3662);