JavaScriptの日付:月の日数とSafariの一部の機能

実際には、スニペット自体


少し前に、特定の月の日数をJavaScriptで取得できるタスクに遭遇しました。 残念ながら、この言語にはネイティブ機能がありません。

このトピックでは、多くのプログラミング言語のよく知られた機能を使用して、1つのエレガントなメカニズムがグーグルで検索されました。 任意の月(たとえば、4月31日)に存在しない日付を設定すると、結果として、オブジェクトは対応する翌月の日付(この場合は5月1日)を保存します。

したがって、指定された月の日数を取得するには、上記の操作の結果を数値32から減算する必要があります。つまり、日付を4月32日に設定すると、結果として5月2日になります。 チェック:32-2 = 30-この日数は4月になります。

var days_in_april = 32 - new Date(2013, 3, 32).getDate(); 

申し込み方法


JavaScriptでのプロトタイピングの優れた可能性を利用して、独自のメソッドを使用してDate言語の組み込みオブジェクトを拡張できます。

  Date.prototype.daysInMonth = function() { return 32 - new Date(this.getFullYear(), this.getMonth(), 32).getDate(); }; 

したがって、現在の月の日数を取得するには、Dateを直接参照するだけで十分です。

  alert(new Date().daysInMonth()); 

しかし、実際には時間が経つにつれて判明したように、この方法は依然として理想的ではありません。 少なくともSafariではそうではありません。

Safariの機能


このスニペットの結果が予期したものと一致しない場合があり、Safariでは通常の30と31の代わりにユニットを取得できました。 この問題の研究により、Safariが日付の処理時に言語の記述された機能をトリガーするケースは100%ではないことが判明しました。 これは、次の例で最もわかりやすく説明されています。

  <script> var date = new Date(1982, 9, 32); document.write(date); </script> 

そして、Chrome 26とSafari 6でそれぞれ見られるものは次のとおりです。

画像

完璧な練習


Safari専用に不要なチェックを積み上げないようにするには、参照番号を32から33に変更するだけです。この方法は、Safariでも他のブラウザでも機能します。

  Date.prototype.daysInMonth = function() { return 33 - new Date(this.getFullYear(), this.getMonth(), 33).getDate(); }; 

Source: https://habr.com/ru/post/J177059/


All Articles