新しい組み込みオブジェクト、Date を見てみましょう。日付と時刻を保存し、日付/時刻を管理するためのメソッドを提供します。
たとえば、作成/変更時刻を保存したり、時間を測定したり、現在の日付を印刷したりするために使用できます。
新しいDate
オブジェクトを作成するには、次のいずれかの引数を指定してnew Date()
を呼び出します。
new Date()
引数なし – 現在の日付と時刻のDate
オブジェクトを作成します。
let now = new Date(); アラート(今); // 現在の日付/時刻を表示します
new Date(milliseconds)
1970 年 1 月 1 日 UTC+0 から経過したミリ秒数 (1/1000 秒) に等しい時刻を持つDate
オブジェクトを作成します。
// 0 は 01.01.1970 UTC+0 を意味します Jan01_1970 = 新しい日付(0); アラート(1970 年 1 月 1 日); // ここで 24 時間を追加し、02.01.1970 UTC+0 を取得します。 let Jan02_1970 = 新しい日付(24 * 3600 * 1000); アラート(1970 年 1 月 2 日);
1970 年の初めから経過したミリ秒数を表す整数は、タイムスタンプと呼ばれます。
これは日付の軽量の数値表現です。 new Date(timestamp)
を使用してタイムスタンプから日付をいつでも作成し、 date.getTime()
メソッドを使用して既存のDate
オブジェクトをタイムスタンプに変換できます (以下を参照)。
1970 年 1 月 1 日より前の日付には負のタイムスタンプが付きます。例:
// 1969 年 12 月 31 日 let Dec31_1969 = 新しい日付(-24 * 3600 * 1000); アラート(1969 年 12 月 31 日);
new Date(datestring)
引数が 1 つあり、それが文字列である場合、それは自動的に解析されます。アルゴリズムはDate.parse
が使用するものと同じです。これについては後で説明します。
let date = new Date("2017-01-26"); アラート(日付); // 時刻が設定されていないため、GMT の午前 0 時であると想定され、 // コードが実行されるタイムゾーンに応じて調整されます // したがって、結果は次のようになります // 2017 年 1 月 26 日木 11:00:00 GMT+1100 (オーストラリア東部夏時間) // または // 2017 年 1 月 25 日水曜日 16:00:00 GMT-0800 (太平洋標準時)
new Date(year, month, date, hours, minutes, seconds, ms)
ローカル タイム ゾーンで指定されたコンポーネントを使用して日付を作成します。最初の 2 つの引数のみが必須です。
year
4 桁である必要があります。互換性のために、2 桁も受け入れられ、 19xx
とみなされます。たとえば、ここでは98
1998
と同じですが、常に 4 桁を使用することを強くお勧めします。
month
カウントは0
(1 月) から始まり、 11
(12 月) までです。
date
パラメータは実際には日であり、存在しない場合は1
とみなされます。
hours/minutes/seconds/ms
が存在しない場合、それらは0
と等しいとみなされます。
例えば:
新しい日付(2011, 0, 1, 0, 0, 0, 0); // 2011 年 1 月 1 日、00:00:00 新しい日付(2011, 0, 1); // 同じです。デフォルトでは時間などは 0 です
最大精度は 1 ミリ秒 (1/1000 秒) です。
let date = 新しい日付(2011, 0, 1, 2, 3, 4, 567); アラート(日付); // 2011 年 1 月 1 日、02:03:04.567
Date
オブジェクトから年、月などにアクセスするメソッドがあります。
getFull Year()
西暦(4桁)を取得します。
getMonth()
0 から 11 までの月を取得します。
getDate()
1 から 31 までの日付を取得します。メソッドの名前は少し奇妙に見えます。
getHours()、getMinutes()、getSeconds()、getMilliseconds()
対応する時間コンポーネントを取得します。
getYear()
ではなくgetFullYear()
多くの JavaScript エンジンは、非標準メソッドgetYear()
を実装しています。このメソッドは廃止されました。場合によっては 2 桁の年を返します。絶対に使用しないでください。年にはgetFullYear()
があります。
さらに、曜日も取得できます。
getDay()
0
(日曜日) から6
(土曜日) までの曜日を取得します。初日は常に日曜日ですが、そうでない国もありますが、変更することはできません。
上記のすべてのメソッドは、ローカル タイム ゾーンを基準としたコンポーネントを返します。
また、タイム ゾーン UTC+0 の日、月、年などを返す UTC 対応のものもあります: getUTCFull Year()、getUTCMonth()、getUTCDay()。 "get"
の直後に"UTC"
挿入するだけです。
ローカル タイム ゾーンが UTC に対して相対的にシフトされている場合、以下のコードは異なる時間を示します。
// 現在の日付 let date = new Date(); // 現在のタイムゾーンの時間 アラート( date.getHours() ); // UTC+0 タイムゾーンでの時間 (夏時間なしのロンドン時間) アラート( date.getUTCHours() );
指定されたメソッドの他に、UTC バリアントを持たない特別なメソッドが 2 つあります。
getTime()
日付のタイムスタンプ (1970 年 1 月 1 日 UTC+0 から経過したミリ秒数) を返します。
getTimezoneOffset()
UTC とローカル タイム ゾーンの差を分単位で返します。
// タイムゾーン UTC-1 にいる場合、60 を出力します // タイムゾーンが UTC+3 の場合、出力は -180 alert( new Date().getTimezoneOffset() );
次のメソッドを使用すると、日付/時刻コンポーネントを設定できます。
setFullYear(year, [month], [date])
setMonth(month, [date])
setDate(date)
setHours(hour, [min], [sec], [ms])
setMinutes(min, [sec], [ms])
setSeconds(sec, [ms])
setMilliseconds(ms)
setTime(milliseconds)
(01.01.1970 UTC からの日付全体をミリ秒単位で設定します)
setTime()
を除くすべてのメソッドには、 setUTCHours()
の UTC バリアントがあります。
ご覧のとおり、 setHours
など、一部のメソッドでは複数のコンポーネントを一度に設定できます。記載されていないコンポーネントは変更されていません。
例えば:
今日 = new Date(); にしてみましょう。 today.setHours(0); アラート(今日); // 今日はまだですが、時間が 0 に変更されます today.setHours(0, 0, 0, 0); アラート(今日); // まだ今日、今 00:00:00 ちょうどです。
自動修正は、 Date
オブジェクトの非常に便利な機能です。範囲外の値を設定すると、自動的に調整されます。
例えば:
let date = new Date(2013, 0, 32); // 2013 年 1 月 32 日 ?!? アラート(日付); // ...2013 年 2 月 1 日です!
範囲外の日付コンポーネントは自動的に配布されます。
「2016 年 2 月 28 日」という日付を 2 日増やす必要があるとします。うるう年の場合は「3月2日」または「3月1日」となる場合があります。それについて考える必要はありません。 2日追加するだけです。 Date
オブジェクトが残りの処理を行います。
let date = new Date(2016, 1, 28); date.setDate(date.getDate() + 2); アラート(日付); // 2016 年 3 月 1 日
この機能は、指定された期間後の日付を取得するためによく使用されます。たとえば、「今から 70 秒後」の日付を取得してみましょう。
let date = new Date(); date.setSeconds(date.getSeconds() + 70); アラート(日付); // 正しい日付を表示します
ゼロまたは負の値を設定することもできます。例えば:
let date = new Date(2016, 0, 2); // 2016 年 1 月 2 日 日付.setDate(1); // 月の 1 日を設定します アラート(日付); 日付.setDate(0); // min day は 1 なので、前月の末日とみなされます アラート(日付); // 2015 年 12 月 31 日
Date
オブジェクトが数値に変換されると、 date.getTime()
と同じタイムスタンプになります。
let date = new Date(); アラート(+日付); // date.getTime() と同じミリ秒数
重要な副作用: 日付を減算することができ、結果はその差がミリ秒単位で表示されます。
これは時間の測定に使用できます。
let start = new Date(); // 時間の計測を開始 // 仕事をする for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } let end = new Date(); // 時間の計測を終了 alert( `ループには ${end - start} ミリ秒かかりました` );
時間を測定するだけの場合は、 Date
オブジェクトは必要ありません。
現在のタイムスタンプを返す特別なメソッドDate.now()
があります。
これは意味的にはnew Date().getTime()
と同等ですが、中間のDate
オブジェクトは作成されません。そのため、処理が速く、ガベージ コレクションに負担をかけません。
これは主に利便性のため、または JavaScript でのゲームやその他の特殊なアプリケーションなど、パフォーマンスが重要な場合に使用されます。
したがって、これはおそらくより良いでしょう:
let start = Date.now(); // 1970 年 1 月 1 日からのミリ秒カウント // 仕事をする for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } let end = Date.now(); // 終わり alert( `ループには ${end - start} ミリ秒かかりました` ); // 日付ではなく数値を引きます
CPU を大量に消費する関数の信頼できるベンチマークが必要な場合は、注意する必要があります。
たとえば、2 つの日付の差を計算する 2 つの関数を測定してみましょう。どちらの方が速いでしょうか?
このようなパフォーマンス測定は、多くの場合「ベンチマーク」と呼ばれます。
// date1 と date2 がありますが、どちらの関数がその差をミリ秒単位で速く返すでしょうか? 関数 diffSubtract(日付 1, 日付 2) { date2 - date1 を返します。 } // または 関数 diffGetTime(日付 1, 日付 2) { date2.getTime() - date1.getTime() を返します。 }
これら 2 つはまったく同じことを行いますが、1 つは明示的なdate.getTime()
使用して日付をミリ秒単位で取得し、もう 1 つは日付から数値への変換に依存します。彼らの結果は常に同じです。
それで、どちらが速いでしょうか?
最初のアイデアは、連続して何回も実行して、時間差を測定することかもしれません。私たちの場合、関数は非常に単純なので、少なくとも 100,000 回実行する必要があります。
測定しましょう:
関数 diffSubtract(日付 1, 日付 2) { date2 - date1 を返します。 } 関数 diffGetTime(日付 1, 日付 2) { date2.getTime() - date1.getTime() を返します。 } 関数ベンチ(f) { date1 = 新しい日付(0) にします。 let date2 = new Date(); let start = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); Date.now() を返す - 開始; } alert( 'diffSubtract の時間: ' + bench(diffSubtract) + 'ms' ); alert( 'diffGetTime の時間: ' + bench(diffGetTime) + 'ms' );
おお! getTime()
使用すると、はるかに高速になります。これは、型変換がないため、エンジンの最適化がはるかに簡単になるためです。
さて、何かあります。しかし、それはまだ良いベンチマークではありません。
bench(diffSubtract)
の実行時に、CPU が何かを並行して実行し、リソースを消費していたと想像してください。そして、 bench(diffGetTime)
までに、その作業は終了します。
最新のマルチプロセス OS にとってはかなり現実的なシナリオです。
その結果、最初のベンチマークの CPU リソースは 2 番目のベンチマークよりも少なくなります。それは誤った結果につながる可能性があります。
ベンチマークの信頼性を高めるには、ベンチマークのパック全体を複数回再実行する必要があります。
たとえば、次のようになります。
関数 diffSubtract(日付 1, 日付 2) { date2 - date1 を返します。 } 関数 diffGetTime(日付 1, 日付 2) { date2.getTime() - date1.getTime() を返します。 } 関数ベンチ(f) { date1 = 新しい日付(0) にします。 let date2 = new Date(); let start = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); Date.now() を返す - 開始; } time1 = 0 とします。 time2 = 0 とします。 // bench(diffSubtract) と bench(diffGetTime) を交互に 10 回ずつ実行します for (i = 0; i < 10; i++) { time1 += ベンチ(diffSubtract); time2 += ベンチ(diffGetTime); } alert( 'diffSubtract の合計時間: ' + time1 ); alert( 'diffGetTime の合計時間: ' + time2 );
最新の JavaScript エンジンは、何度も実行される「ホット コード」にのみ高度な最適化を適用し始めます (めったに実行されないものを最適化する必要はありません)。したがって、上記の例では、最初の実行は十分に最適化されていません。ヒートアップ実行を追加することもできます。
// メインループの前に「加熱」のために追加 ベンチ(差分減算); ベンチ(diffGetTime); // ベンチマークを開始します for (i = 0; i < 10; i++) { time1 += ベンチ(diffSubtract); time2 += ベンチ(diffGetTime); }
マイクロベンチマークの実行には注意してください
最新の JavaScript エンジンは多くの最適化を実行します。特に演算子の動作方法や組み込み関数など、非常に小さなものをベンチマークする場合、「人工テスト」の結果が「通常の使用法」と比較して微調整される可能性があります。したがって、パフォーマンスを真剣に理解したい場合は、JavaScript エンジンがどのように動作するかを研究してください。そうすれば、おそらくマイクロベンチマークはまったく必要なくなるでしょう。
V8 に関する記事の素晴らしいパックは、https://mrale.ph で見つけることができます。
Date.parse(str) メソッドは文字列から日付を読み取ることができます。
文字列形式はYYYY-MM-DDTHH:mm:ss.sssZ
である必要があります。ここで、
YYYY-MM-DD
– 日付: 年-月-日。
文字"T"
区切り文字として使用されます。
HH:mm:ss.sss
– 時間、時、分、秒、ミリ秒です。
オプションの'Z'
部分は+-hh:mm
形式でタイムゾーンを示します。 1 文字のZ
UTC+0 を意味します。
YYYY-MM-DD
、 YYYY-MM
、さらにはYYYY
など、より短いバリアントも可能です。
Date.parse(str)
を呼び出すと、指定された形式で文字列が解析され、タイムスタンプ (1970 年 1 月 1 日 UTC+0 からのミリ秒数) が返されます。形式が無効な場合は、 NaN
を返します。
例えば:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00'); アラート(ミリ秒); // 1327611110417 (タイムスタンプ)
タイムスタンプからnew Date
オブジェクトを即座に作成できます。
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') ); アラート(日付);
JavaScript の日付と時刻は Date オブジェクトで表されます。 「日付のみ」または「時間のみ」を作成することはできません。 Date
オブジェクトは常に両方を保持します。
月は 0 から数えられます (はい、1 月は 0 月です)。
getDay()
の曜日も 0 から数えられます (つまり日曜日です)。
範囲外のコンポーネントが設定された場合、 Date
自動的に修正されます。日、月、時間の加算/減算に適しています。
日付を減算して、その差をミリ秒単位で求めることができます。これは、 Date
数値に変換されるとタイムスタンプになるためです。
現在のタイムスタンプを高速に取得するには、 Date.now()
を使用します。
他の多くのシステムとは異なり、JavaScript のタイムスタンプは秒単位ではなくミリ秒単位であることに注意してください。
場合によっては、より正確な時間測定が必要になることがあります。 JavaScript 自体には時間をマイクロ秒 (100 万分の 1 秒) 単位で測定する方法がありませんが、ほとんどの環境ではそれが提供されています。たとえば、ブラウザーには、ページの読み込み開始からのミリ秒数をマイクロ秒の精度 (ポイント以降 3 桁) で与える Performance.now() があります。
alert(`読み込みは ${performance.now()}ms 前に開始されました`); // 以下のようなもの: 「読み込みは 34731.26000000001 ミリ秒前に開始されました」 // .26 はマイクロ秒 (260 マイクロ秒) // 小数点以下 3 桁を超える場合は精度誤差となり、最初の 3 桁のみが正しい
Node.jsにはmicrotime
モジュールなどがあります。技術的には、ほぼすべてのデバイスと環境でより正確な精度を得ることができますが、それはDate
にはないだけです。
重要度: 5
日付: 2012 年 2 月 20 日、午前 3 時 12 分のDate
オブジェクトを作成します。タイムゾーンはローカルです。
alert
使用して表示します。
new Date
コンストラクターはローカル タイム ゾーンを使用します。したがって、覚えておくべき唯一の重要なことは、月はゼロから始まるということです。
つまり、2月は1位になります。
日付コンポーネントとして数値を使用した例を次に示します。
//new Date(年、月、日、時、分、秒、ミリ秒) d1 = 新しい日付(2012, 1, 20, 3, 12); アラート( d1 );
次のように、文字列から日付を作成することもできます。
//新しい日付(データ文字列) let d2 = 新しい日付("2012-02-20T03:12"); アラート( d2 );
重要度: 5
関数getWeekDay(date)
を作成して、曜日を短い形式 (「MO」、「TU」、「WE」、「TH」、「FR」、「SA」、「SU」) で表示します。
例えば:
let date = new Date(2012, 0, 3); // 2012 年 1 月 3 日 アラート( getWeekDay(日付) ); // 「TU」を出力する必要があります
テストを含むサンドボックスを開きます。
date.getDay()
メソッドは、日曜日から始まる曜日の番号を返します。
曜日の配列を作成して、その番号から適切な曜日の名前を取得しましょう。
関数 getWeekDay(日付) { let days = ['SU'、'MO'、'TU'、'WE'、'TH'、'FR'、'SA']; 日数を返します[date.getDay()]; } let date = new Date(2014, 0, 3); // 2014 年 1 月 3 日 アラート( getWeekDay(日付) ); // フランス
サンドボックス内のテストを含むソリューションを開きます。
重要度: 5
ヨーロッパ諸国の曜日は月曜日 (1) から始まり、火曜日 (2) を経て日曜日 (7) まで続きます。 date
の「ヨーロッパ」曜日を返す関数getLocalDay(date)
を作成します。
let date = new Date(2012, 0, 3); // 2012 年 1 月 3 日 アラート( getLocalDay(日付) ); // 火曜日には 2 が表示されるはずです
テストを含むサンドボックスを開きます。
関数 getLocalDay(日付) { let day = date.getDay(); if (day == 0) { // ヨーロッパでは平日 0 (日曜日) は 7 です 日 = 7; } 帰国日。 }
サンドボックス内のテストを含むソリューションを開きます。
重要度: 4
date
から数days
前の日付を返す関数getDateAgo(date, days)
を作成します。
たとえば、今日が 20 日の場合、 getDateAgo(new Date(), 1)
は 19 日、 getDateAgo(new Date(), 2)
は 18 日になります。
days=365
以上確実に動作する必要があります。
let date = new Date(2015, 0, 2); アラート( getDateAgo(日付, 1) ); // 1、(2015 年 1 月 1 日) アラート( getDateAgo(日付, 2) ); // 31、(2014 年 12 月 31 日) アラート( getDateAgo(日付, 365) ); // 2、(2014 年 1 月 2 日)
PS 関数は指定されたdate
を変更しないでください。
テストを含むサンドボックスを開きます。
アイデアは単純です。 date
から指定された日数を減算します。
関数 getDateAgo(日付, 日数) { date.setDate(date.getDate() - 日); date.getDate() を返します。 }
…しかし、関数はdate
を変更するべきではありません。日付を与える外部コードは日付が変更されることを想定していないため、これは重要です。
これを実装するには、次のように日付のクローンを作成しましょう。
関数 getDateAgo(日付, 日数) { let dateCopy = new Date(日付); dateCopy.setDate(date.getDate() - 日); dateCopy.getDate() を返します。 } let date = new Date(2015, 0, 2); アラート( getDateAgo(日付, 1) ); // 1、(2015 年 1 月 1 日) アラート( getDateAgo(日付, 2) ); // 31、(2014 年 12 月 31 日) アラート( getDateAgo(日付, 365) ); // 2、(2014 年 1 月 2 日)
サンドボックス内のテストを含むソリューションを開きます。
重要度: 5
月の最後の日を返す関数getLastDayOfMonth(year, month)
を作成します。 2 月は 30 日、31 日、さらには 28/29 日になることもあります。
パラメータ:
year
– 4 桁の年 (2012 など)。
month
– 月、0 ~ 11。
たとえば、 getLastDayOfMonth(2012, 1) = 29
(うるう年、2 月)。
テストを含むサンドボックスを開きます。
来月を使用して日付を作成しましょう。ただし、日としてゼロを渡します。
関数 getLastDayOfMonth(年, 月) { let date = new Date(年、月 + 1、0); date.getDate() を返します。 } アラート( getLastDayOfMonth(2012, 0) ); // 31 アラート( getLastDayOfMonth(2012, 1) ); // 29 アラート( getLastDayOfMonth(2013, 1) ); // 28
通常、日付は 1 から始まりますが、技術的には任意の数値を渡すことができ、日付は自動的に調整されます。したがって、0 を渡すと、「その月の 1 日の 1 日前」、つまり「前月の末日」を意味します。
サンドボックス内のテストを含むソリューションを開きます。
重要度: 5
今日の始まりからの秒数を返す関数getSecondsToday()
を作成します。
たとえば、現在が10:00 am
で、夏時間シフトがなかった場合、次のようになります。
getSecondsToday() == 36000 // (3600 * 10)
この機能はいつでも動作するはずです。つまり、「今日」という値をハードコーディングしてはなりません。
秒数を取得するには、現在の日時 00:00:00 を使用して日付を生成し、それを「現在」から減算します。
違いは 1 日の始まりからのミリ秒数であり、秒を取得するにはこれを 1000 で割る必要があります。
関数 getSecondsToday() { let now = new Date(); // 現在の日/月/年を使用してオブジェクトを作成します let today = new Date(now.getFull Year(), now.getMonth(), now.getDate()); diff = 今 - 今日; にしてみましょう。 // ミリ秒の差 return Math.round(diff / 1000); // 秒を作る } アラート( getSecondsToday() );
別の解決策は、時間/分/秒を取得して秒に変換することです。
関数 getSecondsToday() { d = 新しい Date(); とします。 戻り値 d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds(); } アラート( getSecondsToday() );
重要度: 5
明日までの秒数を返す関数getSecondsToTomorrow()
を作成します。
たとえば、現在が23:00
の場合、次のようになります。
getSecondsToTomorrow() == 3600
PS この関数はどの日でも機能するはずです。「今日」はハードコーディングされていません。
明日までのミリ秒数を取得するには、「tomorrow 00:00:00」から現在の日付を減算します。
まず、その「明日」を生成し、それを実行します。
関数 getSecondsToTomorrow() { let now = new Date(); // 明日の日付 明日 = new Date(now.getFull Year(), now.getMonth(), now.getDate()+1); diff = 明日 - 今; とします。 // ミリ秒単位の差 return Math.round(diff / 1000); // 秒に変換します }
代替ソリューション:
関数 getSecondsToTomorrow() { let now = new Date(); let 時間 = now.getHours(); let minutes = now.getMinutes(); let 秒 = now.getSeconds(); totalSecondsToday = (時間 * 60 + 分) * 60 + 秒とします。 totalSecondsInADay = 86400 とします。 totalSecondsInADay - totalSecondsToday を返します。 }
多くの国では夏時間 (DST) が導入されているため、23 時間または 25 時間になる日があることに注意してください。そのような日は別個に扱いたい場合があります。
重要度: 4
次のようにdate
をフォーマットする関数formatDate(date)
を作成します。
以降のdate
が 1 秒未満経過した場合は、 "right now"
になります。
それ以外の場合、 date
からの経過時間が 1 分未満の場合は、 "n sec. ago"
になります。
それ以外の場合、1 時間未満の場合は、 "m min. ago"
。
それ以外の場合は、 "DD.MM.YY HH:mm"
形式の完全な日付。つまり、 "day.month.year hours:minutes"
、すべて 2 桁の形式です (例: 31.12.16 10:00
。
例えば:
alert( formatDate(新しい日付(新しい日付 - 1)) ); // "今すぐ" alert( formatDate(新しい日付(新しい日付 - 30 * 1000)) ); // 「30秒前」 alert( formatDate(新しい日付(新しい日付 - 5 * 60 * 1000)) ); // 「5分前」 // 昨日の日付 (例: 31.12.16 20:00) alert( formatDate(新しい日付(新しい日付 - 86400 * 1000)) );
テストを含むサンドボックスを開きます。
date
から現在までの時間を取得するには、日付を減算しましょう。
関数 formatDate(日付) { let diff = new Date() - 日付; // ミリ秒単位の差 if (diff < 1000) { // 1 秒未満 「今すぐ」を返します。 } let sec = Math.floor(diff / 1000); // diff を秒に変換します if (秒 < 60) { 秒 + ' 秒を返します。前'; } let min = Math.floor(diff / 60000); // diff を分に変換します if (分 < 60) { 最小値 + ' 最小値を返します。前'; } // 日付の書式を設定します // 1 桁の日/月/時/分に先頭のゼロを追加します d = 日付とします。 d = [ '0' + d.getDate()、 '0' + (d.getMonth() + 1), '' + d.getFull Year(), '0' + d.getHours()、 '0' + d.getMinutes() ].map(コンポーネント => コンポーネント.スライス(-2)); // すべてのコンポーネントの最後の 2 桁を取得します // コンポーネントを日付に結合します return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':'); } alert( formatDate(新しい日付(新しい日付 - 1)) ); // "今すぐ" alert( formatDate(新しい日付(新しい日付 - 30 * 1000)) ); // 「30秒前」 alert( formatDate(新しい日付(新しい日付 - 5 * 60 * 1000)) ); // 「5分前」 // 昨日の日付 (2016 年 12 月 31 日 20:00 など) alert( formatDate(新しい日付(新しい日付 - 86400 * 1000)) );
代替ソリューション:
関数 formatDate(日付) { dayOfMonth = date.getDate(); にします。 月 = date.getMonth() + 1; とします。 年 = date.getFull Year(); にします。 let 時間 = date.getHours(); let minutes = date.getMinutes(); diffMs = new Date() - 日付; diffSec = Math.round(diffMs / 1000); とします。 diffMin = diffSec / 60 とします。 diffHour = diffMin / 60; とします。 // 書式設定 年 = year.toString().slice(-2); 月 = 月 < 10 ? '0' + 月 : 月; 月の日 = 月の日 < 10 ? '0' + 月の日 : 月の日; 時間 = 時間 < 10 ? '0' + 時間 : 時間; 分 = 分 < 10 ? '0' + 分 : 分; if (diffSec < 1) { 「今すぐ」を返します。 else if (diffMin < 1) { `${diffSec} 秒を返します。前に else if (diffHour < 1) { `${diffMin} 分を返します。前に } それ以外 { `${日}.${月}.${年} ${時間}:${分}`を返します } }
サンドボックス内のテストを含むソリューションを開きます。