1. ホーム
  2. ジャバスクリプト

[解決済み】safariの日付が無効

2022-04-06 04:30:46

質問

 alert(new Date('2010-11-29'));

クローム、ffは問題ないのですが、サファリは"invalid date"と出ます。なぜでしょうか?

edit : OK、下のコメントにあるように、文字列解析を使用して、これを試してみました。

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

編集 2018年03月22日 : まだここに着地する人がいるようだ - 今日、私が使うのは moment または date-fns で終わりです。Date-fnsも非常に痛みがなく、軽いです。

解決方法は?

パターン yyyy-MM-dd は公式にサポートされているフォーマットではありません。 Date コンストラクタを使用します。Firefoxはサポートしているようですが、他のブラウザが同じようにサポートするかどうかは当てにしないでください。

対応する文字列を紹介します。

  • MM-dd-yyyy
  • yyyy/MM/dd
  • MM/dd/yyyy
  • MMMM dd, yyyy
  • MMM dd, yyyy

日付JS は、非標準の日付フォーマットをパースするための良いライブラリのようです。

編集 : 今確認しました ECMA-262規格 . 15.9.1.15項より引用。

日付時刻文字列の書式

ECMAScript は、文字列を定義しています。 日付-時刻の交換フォーマット を簡略化したものです。 8601 拡張フォーマット このフォーマットは は以下の通りです。YYYY-MM-DDTHH:mm:ss.sssZ ここで、フィールドは以下の通りである。

  • YYYY はグレゴリオ暦の西暦の小数点以下の数字です。
  • quot;-"(ハイフォン)は文字列中に文字通り2回出現します。
  • MMは01(1月)~12(12月)の月です。
  • DD は 01 から 31 までの月の日数です。
  • T"は、文字列の中に文字どおり表示され、その文字列が始まることを示します。 time 要素。
  • HH は、午前0時から経過した完全な時間の数を2つで表します。 10進数で表示します。
  • ":"(コロン)は文字列中に文字通り2回出現します。
  • mmは、時間の開始からの完全な分数です。 10進数で2桁。
  • ssは、「分」の開始からの完全な「秒」の数です。 を10進数2桁で表示します。
  • ."(ドット)は文字列の中に文字通り現れます。
  • sssは、1秒の始まりからの完全なミリ秒の数です。 秒を10進数3桁で表したものです。いずれも とミリ秒のフィールドがあります。 を省略することができる。
  • Zは、"Z"(UTCの場合)または"+"または"-"で指定されるタイムゾーン・オフセットです。 の後に時間表現hh:mmが続きます。

この書式には、日付のみの書式も含まれます。

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD
<ブロッククオート

また、時間帯のみのフォームで オプションでタイムゾーンオフセットが追加されます。

  • THH:mm
  • THH:mm:ss
  • THH:mm:ss.sss

また、quot;date-times"も含まれます。 は、上記の任意の組み合わせとすることができる。

ということで、YYYY-MM-DDは標準に含まれているようですが、なぜかSafariは対応していないようです。

更新情報 を見てから datejs ドキュメント このようなコードで、あなたの問題は解決するはずです。

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");