web-dev-qa-db-ja.com

日付のないJavascript解析時間

コード内で日付なしのTimesを解析および操作する必要があります。たとえば、タイムピッカーから文字列「15:00」を取得する場合があります。これをある種のTimeオブジェクトに変換したい-私は通常Pythonで働き、これには異なるDate、Time、Datetimeオブジェクトがあります。

しかし、私が見たすべてのソリューションは、Dateオブジェクトの使用に焦点を当てています。これは「15:00」のような文字列を解析できません。日付情報が必要なためです。任意の日付情報をTimesに追加したくありません-特に、Dateは日やロケールに応じて夏時間のようなことを前提としているため、時刻を自動的に変換しようとするリスクがあるようです指定されたロケール。さらに、時間を追加できるようにしたい、例えば「15:00 + 1時間」

日付に関連付けられていない「生の」時間を解析して処理するための推奨ソリューションは何ですか?

43
mangecoeur

残念ながら、素晴らしい解決策はありません。 JavaScriptにはDateオブジェクトしかありませんが、実際には日付と時刻であるため、おそらく間違った名前になっています。

あなたがもっと深く考えたいことの一つ-あなたは時間だけで働きたいと言いますが、あなたはtime-of-dayを意味しますかあなたは時間の期間を意味しますか?これらは2つの関連する概念ですが、わずかに異なる概念です。

たとえば、「15:00 + 1時間」のような操作が必要だと言ったとします。どちらにしても、明らかに16:00になります。しかし、「15:00 + 10時間」はどうでしょうか。期間について話している場合は25:00ですが、時刻について話している場合は01:00になります。

実際には、すべての日に24時間があるわけではないため、notは01:00である可能性があります。一部の日には、その時間帯とその日にDSTが開始または停止するかどうかに応じて、23、23.5、24.5、または25時間があります。そのため、時刻のコンテキストでは、おそらくdo計算に特定の日付とゾーンを含める必要があります。もちろん、24時間連続で話している場合、この点は無関係です。

durationsについて話している場合は、 moment.js をもう一度見たいが、momentオブジェクト。そこに別のオブジェクトがあります、moment.duration。参照は here です。

最後に、単純なjavascriptを使用して、時間文字列からの時間と分を数値として解析することを検討してください。必要に応じて数値を操作し、文字列を再度出力します。しかし、あなたの質問はもっと管理されたものを探しているようです。

16

12時間または24時間のmoment.jsソリューションを以下に示します。

moment('7:00 am', ['h:m a', 'H:m']); // Wed Dec 30 2015 07:00:00 GMT-0600 (CST)
moment('17:00', ['h:m a', 'H:m']);   // Wed Dec 30 2015 17:00:00 GMT-0600 (CST)
moment('17:00 am', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST)
moment('17:00 pm', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST)

http://momentjs.com/docs/#/parsing/string-formats/

61
Michael Cole

私はすでにアプリでmomentを使用していたので、次のものを使用することになりました:

var str = '15:16:33';
var d = new moment(str, 'HH:mm:ss');

使用できる他のフォーマット文字列については Moment String + Format docs をご覧ください。

17
MindJuice

私はプロジェクトで最近これをしなければなりませんでしたが、実際にはmoment.jsを含める必要はありませんでした。使用した方法は、次のように時間を手動で解析することでした:

function parseTime(time) {    
    let timeInt = parseInt(time);
    let minutes = time.substring(3,5);

    // you could then add or subtract time here as needed

    if(time > '12:00') {
         return `${timeInt - 12}:${minutes} PM`;
    } else {
         return `${timeInt}:${minutes} AM`;
    }
}

モーメントを使用したくない場合は、これを代替のスターターとして使用します。この例ではes6構文を使用しています。

1
rhysclay