web-dev-qa-db-ja.com

サファリの無効な日付

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

chrome、ffにはこれに関する問題はありませんが、サファリは「無効な日付」と叫びます。どうして ?

編集: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年3月22日編集:人々がまだここに着陸しているようです-今日、私はmomentまたはdate-fnsを使用して、これで完了です。 Date-fnsは非常に痛みが少なく、軽量です。

121
Shrinath

パターンyyyy-MM-ddは、Dateコンストラクターで公式にサポートされている形式ではありません。 Firefoxはそれをサポートしているように見えますが、同じことをしている他のブラウザに頼らないでください。

このサイト から取得した、サポートされている文字列の一部を次に示します。

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

DateJS は、非標準の日付形式の解析に適したライブラリのようです。

編集:チェックしただけ ECMA-262標準 セクション15.9.1.15からの引用:

日時文字列形式

ECMAScriptは、ISO 8601拡張形式の簡素化に基づいて、日時の文字列交換形式を定義します。形式は次のとおりです。YYYY-MM-DDTHH:mm:ss.sssZここで、フィールドは次のとおりです。

  • YYYYは、グレゴリオ暦の年の10進数です。
  • 「-」(ハイフォン)は、文字列に文字通り2回現れます。
  • MMは、01(1月)から12(12月)までの月です。
  • DDは01〜31の月の日です。
  • 「T」は文字列に文字通り表示され、時間要素の始まりを示します。
  • HHは、真夜中から2桁の10進数として経過した完全な時間数です。
  • 「:」(コロン)は、文字列に文字通り2回現れます。
  • mmは、時間の開始からの2桁の10進数としての完全な分数です。
  • ssは、2桁の10進数として、分が始まってからの完全な秒数です。
  • 「。」 (ドット)は文字列にそのまま表示されます。
  • sssは、3桁の10進数としての秒の開始からの完全なミリ秒数です。両方の「。」ミリ秒フィールドは省略できます。
  • Zは、 "Z"(UTCの場合)または "+"または "-"の後に時間式hh:mmが指定されたタイムゾーンオフセットです。

この形式には、日付のみのフォームが含まれます。

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

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

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

また、上記の任意の組み合わせである「日時」も含まれます。

したがって、YYYY-MM-DDは標準に含まれているようですが、何らかの理由でSafariはサポートしていません。

Updatedatejs documentation を見た後、これを使用して、次のようなコードを使用して問題を解決する必要があります。

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");
140
darioo

Safariで正しく実行できないという理由だけで新しいライブラリを実装するのは多すぎて、正規表現が過剰です。 onelinerは次のとおりです。

console.log (new Date('2011-04-12'.replace(/-/g, "/")));
182
Elzo Valugi

私は同様の問題に直面していました。 Date.Parse("DATESTRING")はChrome(バージョン59.0.3071.115)で動作していましたが、Safari(バージョン10.1.1(11603.2.5))では動作していませんでした

サファリ:

Date.parse("2017-01-22 11:57:00")
NaN

クロム:

Date.parse("2017-01-22 11:57:00")
1485115020000

私のために働いた解決策は、dateStringのスペースを"T"に置き換えることでした。 (例:dateString.replace(/ /g,"T")

サファリ:

Date.parse("2017-01-22T11:57:00")
1485086220000

クロム:

Date.parse("2017-01-22T11:57:00")
1485115020000

Safariブラウザーからの応答は、Chromeブラウザーで表示される応答よりも8時間(28800000ms)少ないことに注意してください。これは、Safariが応答をローカルTZ(UTCから8時間遅れて)で返したためです

同じTZで両方の時間を取得するには

サファリ:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

クロム:

Date.parse("2017-01-22T11:57:00Z")
1485086220000
30
nizantz

私は問題を解決するために瞬間を使用します。例えば

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
9
liwp_Stephen

ほとんどのブラウザで動作するソリューションを使用するには、この形式で日付オブジェクトを作成する必要があります

(year, month, date, hours, minutes, seconds, ms)

例えば。:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

iE、FF、ChromeおよびSafariで正常に動作します。さらに古いバージョン。

IEデベロッパーセンター:日付オブジェクト(JavaScript)

Mozilla Dev Network:Date

8
Luxx

文字列を日付形式に変換します(サーバーのタイムゾーンを知る必要があります)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

ここで、+ 08:00 =サーバーからのタイムゾーン

6

私は同じ問題を抱えていました。その後、 moment.Js を使用しました。問題はなくなりました。

文字列から瞬間を作成する場合、まず文字列が既知のISO 8601形式と一致するかどうかを確認し、既知の形式が見つからない場合は新しいDate(string)にフォールバックします。

警告:文字列の解析に対するブラウザのサポートには一貫性がありません。どの形式をサポートするかについての仕様がないため、一部のブラウザーで機能するものは他のブラウザーでは機能しません。

ISO 8601文字列以外の解析結果の一貫性を保つには、文字列+形式を使用する必要があります。

e.g。

var date= moment(String);
4
Sampath

ブラウザが ISO 8601 (または日付のみのサブセット)をサポートすることを期待するかもしれませんが、そうではありません。私が知っているすべてのブラウザ(少なくとも私が使用している米国/英語ロケール)は、恐ろしいUS MM/DD/YYYY形式を解析できます。

すでに日付の一部がある場合は、代わりに Date.UTC() を使用してみてください。使用しないが、YYYY-MM-DD形式を使用する必要がある場合は、正規表現を使用して既知の部分を解析し、Date.UTC()に渡すことをお勧めします。

3
Phrogz

fix-dateDateをハイジャックするのはどうですか?依存関係なし、最小+ gzip = 280 B

1
kenberkeley

以下の形式を使用すると、すべてのブラウザで動作します

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

//出力は次のようになります。「2016年3月23日水曜日00:00:00 GMT + 0530(IST)」

//この場合、ISTで示される現在のタイムゾーンになり、UTCタイムゾーンに変換できます

alert(dateObj.toUTCSting);

//出力はこのようになります「火、2016年3月22日18:30:00 GMT」

現在、dateObjはGMT形式で時刻を表示することに注意してください。また、日付と時刻もそれに応じて変更されていることに注意してください。

「toUTCSting」関数は、グリニッジ子午線で対応する時間を取得します。これは、現在のタイムゾーンとグリニッジ子午線のタイムゾーンとの時間差を確立することにより達成されます。

上記の場合、変換前の時間は2016年の3月23日00:00時間と分でした。また、GMT + 0530(IST)時間からGMTへの変換後(この場合、指定されたタイムスタンプから5.30時間を差し引きます)ケース)時間は、2016年の3月22日の18.30時間を反映しています(最初の時間から正確に5.30時間遅れています)。

さらに、日付オブジェクトをタイムスタンプに変換するには、使用できます

alert(dateObj.getTime());

//出力はこの「1458671400000」に似たものになります

これにより、時間の一意のタイムスタンプが得られます

1
Abhay Aradhya

最適な方法は、次の形式を使用することです。

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

これはすべてのブラウザでサポートされており、問題は発生しません。月は0から11まで書かれていることに注意してください。

1
Daniël Brito

Safariで直面している同じ問題は、これをWebページに挿入することで解決しました。

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

それもあなたのケースでうまくいくことを願っています

ありがとう

@nizantzが前述したように、SafariではDate.parse()を使用しても機能しませんでした。少し調査した結果、FileオブジェクトのlastDateModifiedプロパティが廃止され、Safariでサポートされなくなったことを知りました。 FileオブジェクトのlastModifiedプロパティを使用して問題を解決しました。悪い情報がオンラインで見つかったとき、それを確かに嫌います。

私の問題について学ぶために必要な道を進むのを助けてくれたこの投稿に貢献してくれたすべての人に感謝します。この情報がなかったら、おそらく根本的な問題を見つけられなかっただろう。たぶん、これは私の似たような状況で他の誰かを助けるでしょう。

0
S. Costello

Safariブラウザでも同じ問題に直面しています

var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’

ここで解決策:

var d = new Date(2011, 01, 07); // yyyy, mm-1, dd  
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss  
var d = new Date("02/07/2011"); // "mm/dd/yyyy"  
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"  
var d = new Date(1297076700000); // milliseconds  
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC 
0
venkatSkpi