2016-04-23 27 views
2

私は列車旅行の2つのタイムスタンプの差を分単位で確認するためにmomentjsを使用しています。 データを取得するために使用しているAPIは、24時間形式の戻り値です(momentjs:HH:mm:ss)。Moment.js 24時間制の24時間形式

旅行が翌日に続く場合、時間は「24:12:00」と表示されます。これはかなり奇妙です。モーメンツはこれに対処できません。そのような値で時間差を計算しようとすると、「NaN」になります。

"24"のオカレンスを "00"に変換する関数を作成しました。

function maintainHour (timeString) { 
    var splitted = timeString.split(':'); 
    if(splitted[0] == '24') { 
    splitted[0] = '00'; 
    } 

    return splitted[0] + ':' + splitted[1] + ':' + splitted[2]; 
} 

私は1つのタイムスタンプと時間として「00」を持っているタイムスタンプの違いを確認するためにdiff()機能を使用している場合、私はそれが現在の日か翌日以内のタイムスタンプのかどうか異なることができません。したがって、次の日の24時間までの正のX分ではなく、現在の時刻が例えば16:00(この日の朝を意味する)の場合、差は約-900となります。

これに対処する方法はありますか?

答えて

2

あなたはちょうど時間を扱っているため、このような問題が発生します。ちょうど時間を扱うとき、瞬間は解析中の今日を仮定します。もちろん、それらの時間を0に戻すと、記述している問題が発生します。終了時刻は開始時刻よりも早いです。

これは直感的ではありませんが、実際にはこの問題を解決するためにsetの 'オーバーフロー'機能を使用しています。

モーメントセット関数(.hours().minutes()など)に値を渡すと、値が許容範囲を超えると、次の単位にオーバーフローします。ここでそれをあなたの利益に利用することができます。あなたはそうであるように、後で時間を分けることができます。何が起こるかの具体的な例として

moment.utc('2016-01-01') 
.set({hours:splitted[0], minutes:splitted[1], seconds:splitted[2]}).format() 

:次に、このような何かを

moment.utc('2016-01-01').set({hours:24, minutes:32, seconds:12}).format() 
"2016-01-02T00:32:12Z" 

あなたが見ることができるように、24は、次の日にそれを押しました。

あなたがここにいるのは時間であり、日付ではないようです。それが正しい場合は、任意の日付を解析日として選択し、あなたの瞬間にはUTCモードを使用することを強くお勧めします。

モーダルを任意の日付でローカルモードで使用すると、DSTの遷移によって相違が生じるような問題が発生する可能性があります。 UTCモードでは、これらは発生しません。

逆に、日付を知っていれば、それを使用し、正しい時間帯(必要に応じて瞬時のタイムゾーン)で使用する必要があります。そのため、DSTの変化をキャプチャして同じ2つの時間の間で変化する時間。

さらに、日付を手動で設定すると、モーメントの最初の呼び出しが、2番目のモーメントの呼び出しとは異なる日付になる競合状態が回避されます。それは後で見つけるのが非常に難しいバグです。

+0

私は間違いなくこれを試してみます。 –

関連する問題