JavaScriptの秒から分と秒


170

これは一般的な問題ですが、解決方法はわかりません。以下のコードは正常に動作します。

var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

ただし、1時間または3600秒になると、0分0秒が返されます。これを回避してすべての分を返すにはどうすればよいですか?

ありがとう


これは、time = 3600の場合、3600%3600は常に0であるためです。したがって、計算によると、他のすべては0になります。
MSI

回答:


338

完全な分数を取得するには、合計秒数を60で割ります(60秒/分)。

var minutes = Math.floor(time / 60);

残りの秒数を取得するには、完全な分に60を掛けて、合計秒数から減算します。

var seconds = time - minutes * 60;

完全な時間も取得したい場合は、合計秒数を3600(60分/時間・60秒/分)で割り、残りの秒を計算します。

var hours = Math.floor(time / 3600);
time = time - hours * 3600;

次に、完全な分と残りの秒を計算します。

ボーナス:

次のコードを使用して、時間をきれいに出力します(Druの推奨)

function str_pad_left(string,pad,length) {
    return (new Array(length+1).join(pad)+string).slice(-length);
}

var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);

57
'var seconds = time%60'を実行して残りの秒数を取得するのは少しクリーンです。
Edward D'Souza

11
@Radioを使用して先行ゼロを追加 function str_pad_left(string,pad,length){ return (new Array(length+1).join(pad)+string).slice(-length); } var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Dru

1
このソリューションは、の負の値に対しては機能しませんtime。たとえば-1秒と入力すると、-1分59秒戻ります...
Pylinux

5
ネガティブな感覚とはtime?論理的には、時間差は常に正です
mcont 2014

4
モジュラスを使用して秒数を取得できます。私の意見ではより読みやすくなっています。var seconds = time % 60
JCM

106

別の豪華なソリューション:

function fancyTimeFormat(duration)
{   
    // Hours, minutes and seconds
    var hrs = ~~(duration / 3600);
    var mins = ~~((duration % 3600) / 60);
    var secs = ~~duration % 60;

    // Output like "1:01" or "4:03:59" or "123:03:59"
    var ret = "";

    if (hrs > 0) {
        ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
    }

    ret += "" + mins + ":" + (secs < 10 ? "0" : "");
    ret += "" + secs;
    return ret;
}

~~の省略形ですMath.floor。詳細については、このリンク参照してください

オンラインで試す


14
の意味は~~何ですか?
mcont 2014

9
これはの基本的な略語です。このリンクをMath.floor参照してください
lapin

正常に動作します..... :)このように値を丸めることができますhrs = hrs.toFixed(0); mins = mins.toFixed(0); secs = secs.toFixed(0);
Abdul Khaliq 2015年

1
この解決策をありがとう!time = math.round(time)最初の行に追加して、秒を丸めました。
fotoflo 2018

これがより正しい解決策です。上記のように、このページで最も投票数の多いソリューションでは、180秒は2分60秒と表示されます。
SongBox

71

秒をM:SS次のようにフォーマットするための簡単で短いソリューションを期待している人のために:

function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}

行って..
機能は受け入れのどちらかNumber(優先)またはString(あなたが前に付けることで半減させることができます2変換「罰」+のための関数呼び出しの引数にsのように:fmtMSS(+strSeconds))、正の整数の秒を表すs引数として。

例:

fmtMSS(    0 );  //   0:00
fmtMSS(   '8');  //   0:08
fmtMSS(    9 );  //   0:09
fmtMSS(  '10');  //   0:10
fmtMSS(   59 );  //   0:59
fmtMSS( +'60');  //   1:00
fmtMSS(   69 );  //   1:09
fmtMSS( 3599 );  //  59:59
fmtMSS('3600');  //  60:00
fmtMSS('3661');  //  61:01
fmtMSS( 7425 );  // 123:45

壊す:

function fmtMSS(s){   // accepts seconds as Number or String. Returns m:ss
  return( s -         // take value s and subtract (will try to convert String to Number)
          ( s %= 60 ) // the new value of s, now holding the remainder of s divided by 60 
                      // (will also try to convert String to Number)
        ) / 60 + (    // and divide the resulting Number by 60 
                      // (can never result in a fractional value = no need for rounding)
                      // to which we concatenate a String (converts the Number to String)
                      // who's reference is chosen by the conditional operator:
          9 < s       // if    seconds is larger than 9
          ? ':'       // then  we don't need to prepend a zero
          : ':0'      // else  we do need to prepend a zero
        ) + s ;       // and we add Number s to the string (converting it to String as well)
}

注:負の範囲は(0>s?(s=-s,'-'):'')+、戻り式の前に追加することで追加できます(実際に(0>s?(s=-s,'-'):0)+は、同様に機能します)。


よりMath.floor(s)きれいな結果を得るために、最後の行に追加することをお勧めします。とにかく素晴らしい仕事をしてくれてありがとう!
Diego Fortes

@PossessWithin:いいえ、あなたがすべき、NOT一番のため、複数の理由のために(故障・スニペットの)「最後の行にMath.floor(複数可)を追加し、」それはバグ導入する間の値のため910さらに変更せずに、あなたが例えば入力した場合69.25、出力は次のようになり1:9代わりに1:09!この関数(私が明示的に整数秒を指定したもの)は、意図的に愛情を込めて高パフォーマンスのクランチツール/「エンジン」(サイズに関して忍者ゴルフではない)として作成されているため、不要な検証でそのエンジンに負担をかけることは不適切であると考えます/ cleanup / filtering ...
GitaarLAB

...(のような仕事NaN+/-Infinityなど)と丸めオプションアプリケーションが遭遇することができ、特定のニーズや可能性のある入力値に基づく従来の関数を呼び出すには、プログラマが行う必要があり、!当然のことながら、予想される入力値に関するドメインの知識により、特定のユースケースがほぼ常に浮動小数点値受け取り perf-testingがアプリケーションであることを示している場合は、自由にパッチを適用できます。正の値のフローリングのみにパッチを適用する場合は、必ずする必要があります...
GitaarLAB

...修正(9<s?':':':0')(10>s?':0':':')(1つの文字を追加することなく、「犠牲」5~6のうち真のパスを偽パスに)OR (10<=s?':':':0')(2つの文字を追加することなく、5〜6のうち真の経路を維持します)。次に、最後の末尾をの代わりに変更することをお勧めします。32 ビット(符号なし)または31ビット(符号付き)の範囲ではなく、53ビットの範囲全体で正しく動作しながら解決と呼び出しを行う必要がないという美しさを損なわないようにするためです。+s+(s|0) Math.floor(s)Math.floor +/-MAX_SAFE_INTEGERABS(s)
マグネチュード

...符号付きビットORは安全です。また、この特定の修正に注意残りの秒フローリングせずには小数ゼロを付けずに関数出力小数点以下の秒になるだろう、しかし、多くの場合、あなたはおそらく同様に処理する必要があると思います以上の3重要な非ゼロfrationalの数字を持っています。最後に、負の範囲のオプションのプレフィックスコードと組み合わせると、この特定の変更は秒を効果的に切り捨てます(それらをFLOORするのではありません)。PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...
GitaarLAB

21

ネイティブのDateオブジェクトを使用することもできます。

var date = new Date(null);
date.setSeconds(timeInSeconds);

// retrieve time ignoring the browser timezone - returns hh:mm:ss
var utc = date.toUTCString();
// negative start index in substr does not work in IE 8 and earlier
var time = utc.substr(utc.indexOf(':') - 2, 8)

// retrieve each value individually - returns h:m:s
var time = date.getUTCHours() + ':' + date.getUTCMinutes() + ':' +  date.getUTCSeconds();

// does not work in IE8 and below - returns hh:mm:ss
var time = date.toISOString().substr(11, 8);

// not recommended - only if seconds number includes timezone difference
var time = date.toTimeString().substr(0, 8);

もちろん、このソリューションは24時間未満のtimeInSecondsに対してのみ機能します;)


1
Dateオブジェクトにフォーマットを処理させることは考えていませんでした。柔軟性は
低く

私はこれを25秒で試しましたが、01:00:25を返しました。これは1時間25秒に相当します。
2013

はい、おそらくタイムゾーンが原因です。このケースを処理するためにソリューションを更新しました。
hamczu 2013

date構築することができvar date = new Date(timeInSeconds * 1000)
ヌーノ・アンドレ

20

2019最高のバリアント

フォーマット hh:mm:ss

console.log(display(60 * 60 * 2.5 + 25)) // 2.5 hours + 25 seconds

function display (seconds) {
  const format = val => `0${Math.floor(val)}`.slice(-2)
  const hours = seconds / 3600
  const minutes = (seconds % 3600) / 60

  return [hours, minutes, seconds % 60].map(format).join(':')
}


うーん、secondsconstです。再割り当てすることはできません。
ronapelbaum

@ronapelbaumこの引数ではなく、定数は、私はあなたが何を意味するのか理解していない
ИльяЗеленько

@ronapelbaumあなたが使用しなければならないパラメータとしてそれらを取得する代わりに秒を割り当てる場合let、例えば あなたはfunction display (state) { let seconds = state.seconds; ... }おそらくエラーがどこから来たのですか?
レトロバーティゴ

関数paramはconstとして扱う必要があります。使用する%=ときは、このパラメーターを再度割り当てます。そのまま使用seconds%60
ronapelbaum

16
function secondsToMinutes(time){
    return Math.floor(time / 60)+':'+Math.floor(time % 60);
}

3
これは、ゼロパディング秒で改善することができます function secondsToMinutes(time){ return Math.floor(0 / 60)+':'+('0'+Math.floor(0 % 60)).slice(-2); }
ホークス

いいね!@Kusさん、ありがとうございます。これら2つ0のをに置き換えたいと思うかもしれませんがtime、私は正しいですか?
mikey

2
@mikeyおっと!はい、function secondsToMinutes(time){ return Math.floor(time / 60) + ':' + ('0' + Math.floor(time % 60)).slice(-2) }
ホークス

12

先行ゼロを追加するには、次のようにします。

var minutes = "0" + Math.floor(time / 60);
var seconds = "0" + (time - minutes * 60);
return minutes.substr(-2) + ":" + seconds.substr(-2);

素敵で短い


9

ES6を使用して1つのライナーをクリーニングする


const secondsToMinutes = seconds => Math.floor(seconds / 60) + ':' + ('0' + Math.floor(seconds % 60)).slice(-2);

6

ワンライナー(何時間も使えない):

 function sectostr(time) {
    return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
 }

4

秒:h:mm:ss

var hours = Math.floor(time / 3600);
time -= hours * 3600;

var minutes = Math.floor(time / 60);
time -= minutes * 60;

var seconds = parseInt(time % 60, 10);

console.log(hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds));

minutes < 10 ? '0' + minutes : minutes基本的なjsの知識のみを前提として、誰かが私のために説明できますか?
Zediiiii

分が1桁の場合(<10)、先頭にゼロを追加します。
kayz1

助けて!気づかなかった「?」jsの三項演算子でした。
Zediiiii

4

次の関数は、日、時間、分、秒を取得するのに役立ちます

toDDHHMMSS(inputSeconds){
        const Days = Math.floor( inputSeconds / (60 * 60 * 24) );
        const Hour = Math.floor((inputSeconds % (60 * 60 * 24)) / (60 * 60));
        const Minutes = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) / 60 );
        const Seconds = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) % 60 );
        let ddhhmmss  = '';
        if (Days > 0){
            ddhhmmss += Days + ' Day ';
        }
        if (Hour > 0){
            ddhhmmss += Hour + ' Hour ';
        }

        if (Minutes > 0){
            ddhhmmss += Minutes + ' Minutes ';
        }

        if (Seconds > 0){
            ddhhmmss += Seconds + ' Seconds ';
        }
        return ddhhmmss;
    }
alert( toDDHHMMSS(2000));

私はこれが好きです。私は変更if (Days > 0){ ddhhmmss += Days + ' Day '; }するif (Days > 0) {ddhhmmss += Days === 1 ? Days + ' Day ' : Days + ' Days '};と言って1 Day2 Days3 Daysなど他人のために行うことができます似ています。
サント

4

このすべての後、さらに別の簡単なソリューション:

const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());

1
必要なときにreturnを使用しtime.setSeconds(1);ます。1 0 10 0 1
サント

3

これに対するもう1つの非常に洗練されたソリューションは次のとおりです。

/**
 * Convert number secs to display time
 *
 * 65 input becomes 01:05.
 *
 * @param Number inputSeconds Seconds input.
 */
export const toMMSS = inputSeconds => {
    const secs = parseInt( inputSeconds, 10 );
    let minutes = Math.floor( secs / 60 );
    let seconds = secs - minutes * 60;

    if ( 10 > minutes ) {
        minutes = '0' + minutes;
    }
    if ( 10 > seconds ) {
        seconds = '0' + seconds;
    }

    // Return display.
    return minutes + ':' + seconds;
};

2

ゼロを追加するために、たとえば単に使用できる他の完全な関数が必要であるとは本当に思いません。

var mins=Math.floor(StrTime/60);
var secs=StrTime-mins * 60;
var hrs=Math.floor(StrTime / 3600);
RoundTime.innerHTML=(hrs>9?hrs:"0"+hrs) + ":" + (mins>9?mins:"0"+mins) + ":" + (secs>9?secs:"0"+secs);

そもそも条件文があるのはそのためです。

(条件?trueの場合:falseの場合)たとえば、秒数が単に表示秒より9より大きい場合は、その前に文字列0を追加します。


2

これを試してください:秒をHOURS、MIN、SECに変換します。

function convertTime(sec) {
    var hours = Math.floor(sec/3600);
    (hours >= 1) ? sec = sec - (hours*3600) : hours = '00';
    var min = Math.floor(sec/60);
    (min >= 1) ? sec = sec - (min*60) : min = '00';
    (sec < 1) ? sec='00' : void 0;

    (min.toString().length == 1) ? min = '0'+min : void 0;    
    (sec.toString().length == 1) ? sec = '0'+sec : void 0;    

    return hours+':'+min+':'+sec;
}

2

var seconds = 60;
var measuredTime = new Date(null);
measuredTime.setSeconds(seconds); // specify value of SECONDS
var Time = measuredTime.toISOString().substr(11, 8);
document.getElementById("id1").value = Time;
<div class="form-group">
  <label for="course" class="col-md-4">Time</label>
  <div class="col-md-8">
    <input type="text" class="form-control" id="id1" name="field">Min
  </div>
</div>


2

あなたが使用している場合はMoment.jsを、あなたはそこに組み込まれて使用することができますDurationオブジェクト

const duration = moment.duration(4825, 'seconds');

const h = duration.hours(); // 1
const m = duration.minutes(); // 20
const s = duration.seconds(); // 25

2

2020年の更新

基本的な数学と単純なJavaScriptを使用すると、これは数行のコードで実行できます。

例-に変換7735 secondsHH:MM:SSます。


数学:

計算に使用:

  1. Math.floor()- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

このMath.floor()関数は、指定された数値以下の最大の整数を返します。

  1. %算術演算子(剰余)-https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder

剰余演算子は、1つのオペランドが2番目のオペランドで除算されたときに残った剰余を返します。それは常に配当のサインをとります。

以下のコードを確認してください。秒は3600、時間数と残りを取得するためにで割られます。残りは分と秒の数を計算するために使用されます。

HOURS => 7735 / 3600 = 2 remainder 535

MINUTES => 535 / 60 = 8 remainder 55

SECONDS => 55


先行ゼロ:

ここでの多くの回答は、複雑な方法を使用して、先頭にゼロを付けて適切な方法で時間数、分数、秒数を示しています。これは4504を使用して行うことができますpadStart()。これは文字列に対して機能するため、を使用して数値を文字列に変換する必要がありますtoString()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

このpadStart()メソッドは、結果の文字列が指定された長さに達するまで、現在の文字列を別の文字列で(必要に応じて複数回)パディングします。パディングは、現在の文字列の先頭から適用されます。


コード:

function secondsToTime(e){
    var h = Math.floor(e / 3600).toString().padStart(2,'0'),
        m = Math.floor(e % 3600 / 60).toString().padStart(2,'0'),
        s = Math.floor(e % 60).toString().padStart(2,'0');
    
    return h + ':' + m + ':' + s;
}

console.log(secondsToTime(7735));  //02:08:55

/*
secondsToTime(SECONDS) => HH:MM:SS 

secondsToTime(8)       => 00:00:08 
secondsToTime(68)      => 00:01:08
secondsToTime(1768)    => 00:29:28
secondsToTime(3600)    => 01:00:00
secondsToTime(5296)    => 01:28:16
secondsToTime(7735)    => 02:08:55
secondsToTime(45296)   => 12:34:56
secondsToTime(145296)  => 40:21:36
secondsToTime(1145296) => 318:08:16
*/


1

時間の分と秒の部分を追跡するのに十分なコードを実行しました。

あなたができることは時間係数を追加することです:

var hrd = time % (60 * 60 * 60);
var hours = Math.floor(hrd / 60);

var mind = hrd % 60;
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

var moreminutes = minutes + hours * 60

これにより、必要なものも得られます。


「時間」を秒単位で試してみましたが、うまくいきませんでした。例えば、975秒の手段は、時間16である手段、= 975 HRD
Spedge

1

私はこれを行うより速い方法を考えていました、そしてこれは私が思いついたものです

var sec = parseInt(time);
var min=0;
while(sec>59){ sec-=60; min++;}

「時間」を分と秒に変換したい場合、例えば:

// time = 75,3 sec
var sec = parseInt(time); //sec = 75
var min=0;
while(sec>59){ sec-=60; min++;} //sec = 15; min = 1

1

私の2セントを入れる:

function convertSecondsToMinutesAndSeconds(seconds){
            var minutes;
            var seconds;
            minutes = Math.floor(seconds/60);
            seconds = seconds%60;

            return [minutes, seconds];
        }

したがって、この :

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);

次の出力が表示されます。

[1,41];

次に、次のように印刷します。

console.log('TIME : ' +  minutesSeconds[0] + ' minutes, ' + minutesSeconds[1] + ' seconds');

//TIME : 1 minutes, 41 seconds

1

strftime.js(strftime github)は、最高の時間フォーマットライブラリの1つです。非常に軽量で30KBあり、効果的です。これを使用すると、1行のコードで秒を時間に簡単に変換でき、ほとんどがネイティブのDateクラスに依存します。

新しい日付を作成するとき、各オプションの引数は次のように位置指定されます。

new Date(year, month, day, hours, minutes, seconds, milliseconds);

したがって、秒までのすべての引数をゼロとして新しい日付を初期化すると、次のようになります。

var seconds = 150;
var date = new Date(0,0,0,0,0,seconds);
=> Sun Dec 31 1899 00:02:30 GMT-0500 (EST)

作成日を見ると、150秒は2分30秒であることがわかります。次に、strftime形式( "MM:SS"の "%M:%S")を使用して、分の文字列を出力します。

var mm_ss_str = strftime("%M:%S", date);
=> "02:30"

1行では、次のようになります。

var mm_ss_str = strftime('%M:%S', new Date(0,0,0,0,0,seconds));
=> "02:30"

さらに、これにより、秒数に基づいて互換性のあるサポートHH:MM:SSおよびMM:SSが可能になります。例えば:

# Less than an Hour (seconds < 3600)
var seconds = 2435;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "40:35"

# More than an Hour (seconds >= 3600)
var seconds = 10050;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "02:47:30"

そしてもちろん、時間の文字列を多かれ少なかれ意味的にしたい場合は、単にstrftimeにしたいフォーマットを渡すことができます。

var format = 'Honey, you said you\'d be read in %S seconds %M minutes ago!';
strftime(format, new Date(0,0,0,0,0,1210));
=> "Honey, you said you'd be read in 10 seconds 20 minutes ago!"

お役に立てれば。


1
export function TrainingTime(props) {
    const {train_time } = props;
    const hours = Math.floor(train_time/3600);
    const minutes = Math.floor((train_time-hours * 3600) / 60);
    const seconds = Math.floor((train_time%60));

    return `${hours} hrs  ${minutes} min  ${seconds} sec`;
}

2
Stack Overflowへようこそ。@PhilRoggenbuckで提案されているように、説明が役立ちます。詳細については、stackoverflow.com
help /

0

私は別の解決策を提案します:

function formatTime(nbSeconds, hasHours) {
    var time = [],
        s = 1;
    var calc = nbSeconds;

    if (hasHours) {
        s = 3600;
        calc = calc / s;
        time.push(format(Math.floor(calc)));//hour
    }

    calc = ((calc - (time[time.length-1] || 0)) * s) / 60;
    time.push(format(Math.floor(calc)));//minute

    calc = (calc - (time[time.length-1])) * 60;
    time.push(format(Math.round(calc)));//second


    function format(n) {//it makes "0X"/"00"/"XX"
        return (("" + n) / 10).toFixed(1).replace(".", "");
    }

    //if (!hasHours) time.shift();//you can set only "min: sec"

    return time.join(":");
};
console.log(formatTime(3500));//58:20
console.log(formatTime(305));//05:05
console.log(formatTime(75609, true));//21:00:09
console.log(formatTime(0, true));//00:00:00


0

私はそれが多くの方法で解決されたことを知っています。速度や名前空間の汚染が問題にならないAfter Effectsスクリプトにこの関数が必要でした。同様のものが必要な人のためにここにドロップします。私もいくつかのテストを書いてうまくいきました。だからここにコードがあります:

Number.prototype.asTime = function () {
    var hour = Math.floor(this / 3600),
        min = Math.floor((this - hour * 3600) / 60),
        sec = this - hour * 3600 - min * 60,
        hourStr, minStr, secStr;
    if(hour){
        hourStr = hour.toString(),
        minStr = min < 9 ? "0" + min.toString() : min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return hourStr + ":" + minStr + ":" + secStr + "hrs";
    }
    if(min){
        minStr = min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return  minStr + ":" + secStr + "min";
    }
    return sec.toString() + "sec";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.