new Date()はChromeでは機能しますがFirefoxでは機能しません


89

次のような日時文字列を作成しています。 2010-07-15 11:54:21

次のコードを使用すると、Firefoxで無効な日付が表示されますが、Chromeでは問題なく機能します

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

firefoxではdate1は無効な日付を与えていますが、Chromeではうまく機能しています主な原因は何ですか?


2
あなたが好きなようにそれを再生したい場合に行くdatejs.com
シナン

すべての実装がECMA-262の形式をサポートしているわけではないため、常に手動で文字列を解析します(ライブラリは役立ちますが、単一の形式では必要ない可能性があります)。
RobG 2016

Firefoxで動作します。
Sm山下

回答:


78

日付オブジェクトを好きなようにインスタンス化することはできません。特定の方法である必要があります。以下は有効な例です。

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

または

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chromeはもっと柔軟でなければなりません。

ソース:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

apsillersコメントから:

EMCAScript仕様では1つの日付形式(YYYY-MM-DDTHH:mm:ss.sssZ)が必要ですが、実装ではカスタム日付形式を自由にサポートできます。 " 文字列が[ECMAScript定義]形式に準拠していない場合関数は、実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックする可能性があります。「ChromeとFFは、単に「実装固有の日付形式」を持っています。


3
Firefoxを含むすべてのブラウザで機能するソリューションを入手しました:stackoverflow.com/a/21984717/586051
Rahul Desai

7
このブラウザの違いが存在する理由について:EMCAScript仕様では正確に1つの日付形式(つまりYYYY-MM-DDTHH:mm:ss.sssZ)が必要です、実装ではカスタム日付形式を自由にサポートできます: " 文字列がその[ECMAScript定義]形式に準拠していない場合、関数は実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックします。「ChromeとFFは、単に「実装固有の日付形式」が異なります。
アプシラー2014

Chromeでは機能するがFirefoxでは機能しない日付形式(「。」を含む月)の一例: '2月。2019年14
-codescribblr

23

これはすべてのブラウザで機能します-

新しい日付( '2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

形式:YYYY-MM-DDTHH:mm:ss.sss

詳細:http : //www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


それが国際標準であることは誰もが知っているからです。w3.org/International/questions/qa-date-format
ボビーテーブル

6
あなたは実際にすべてのブラウザをテストましたか?そして、あなたが持っていると仮定すると、将来のすべてのブラウザがその(非標準の)フォーマットもサポートすることも知っていますか?
RobG 2014年

1
これでうまくいきます。したがって、すでに「2001-1-31 12:00:00」の文字列を取得している場合は、次のように簡単に実行できます。new Date(str.replace(/-/ g、 '/'));
Jianwu Chen

@JianwuChen意図的に標準形式を非標準に変更しています。良い考えではありません。
JJJ

2
3年後、EdgeおよびWindow Safariでは動作しなくなりました。
Mg Thar 2016年

13

オプション1 :

タイムストリングの形式が次のようであるとします。

'2016-03-10 16:00:00.0'

その場合、次のように変換する簡単な正規表現を実行できますISO 8601

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

これにより、次の出力が生成されます。

'2016-03-10T16:00:00.0'

これは標準の日時形式なので、すべてのブラウザでサポートされています。

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

オプション2:

タイムストリングの形式が次のようであるとします。

'02-24-2015 09:22:21 PM'

ここでは、次の正規表現を実行できます。

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

これも、すべてのブラウザでサポートされている形式を生成します。

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

オプション3:

十分にサポートされている標準の1つに調整するのが容易ではないタイムストリングがあるとします。

その場合は、時間文字列をさまざまな部分に分割し、それらをの個別のパラメータとして使用するのが最善ですDate

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = new Date( '2017-08-28 08:02 PM'.replace(/-/ g、' / ')); これは、ChromeでもMozillaでも完全に機能します。
Rahul Mankar 2017

13

これはほとんどのブラウザでも機能します

new Date('2001/01/31 12:00:00')

それはのフォーマットです

"yyyy/MM/dd HH:mm:ss"

3
形式がすべてのブラウザで機能することは保証されていません。
RobG 2016

正解です。答えは私の経験に基づいています。
Alvis

8

それでもダッシュを使用して日付を作成する場合は、次の形式を使用できます。

var date = new Date('2013-08-31T17:00:00Z')

ただし、UTCに従って時間を作成することを覚えておいてください。つまり、GMT + 3(GMTより3時間進んでいる)タイムゾーンに住んでいる場合、このタイムゾーンオフセットが時刻に追加されます。したがって、上記の例では、GMT + 3の場合、この値になります(17:00ではなく20:00であることに注意してください)。

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

末尾に「Z」の文字を必ず追加してください。そうしないと、ChromeとFirefoxは文字列を異なる方法で解析します(1つは時間オフセットを追加し、もう1つは追加しません)。


1
はい、タイムゾーンを指定しないと、chromeとfirefoxの動作が異なります。そして、興味深いことに、Firefoxは間違っていると思います。タイムゾーンがない場合は、GMTを想定する必要があります。Chromeにはありますが、Firefoxにはありません。 ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs 2014年

@ JulianJelfs— " タイムゾーンが存在しない場合はGMTである必要があります "、日付のみ(ISO 8601とは逆)。日付と時刻の文字列の場合は、ローカル(ISO 8601に準拠)を想定する必要があります。ただし、いずれにしても、手動による解析が唯一の安全な方法です。
RobG 2016

5

AngularJSを使用しているときに、FirefoxとSafariの両方で同様の問題が発生していました。たとえば、Angularから返された日付が次のようになっているとします。

2014-06-02 10:28:00

このコードを使用して:

new Date('2014-06-02 10:28:00').toISOString();

FirefoxおよびSafariで無効な日付エラーを返します。ただし、Chromeでは正常に動作します。別の答えが述べたように、Chromeは日付文字列を解析することで、おそらくより柔軟になります。

私の最終的な目標は、特定の方法で日付をフォーマットすることでした。ブラウザ間の互換性の問題と日付のフォーマットの問題の両方を処理する優れたライブラリを見つけました。ライブラリの名前はmoment.jsです。

このライブラリを使用すると、テストしたすべてのブラウザで次のコードが正しく機能します。

moment('2014-06-02 10:28:00').format('MMM d YY')

この追加のライブラリをアプリに含めたい場合は、ブラウザーの互換性の問題を回避しながら、日付文字列をより簡単に作成できます。おまけとして、必要に応じて日付を簡単にフォーマット、追加、減算などするための良い方法があります。


文字列を解析するときは、常にフォーマットをmoment.jsに渡す必要があります。そうでない場合は、有効な日付を作成するものを見つけるまで推測します。
RobG 2016

4

これはあなたのために働くはずです:

var date1 = new Date(year, month, day, hour, minute, seconds);

文字列から日付を作成する必要があったので、次のようにしました。

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

JavaScriptの月は0〜11であることを忘れないでください。そのため、次のように月の値を1だけ減らす必要があります。

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

シンプルなソリューション、これはすべてのブラウザで機能し、

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

私が遭遇した1つの状況は、ミリ秒を処理するときでした。FFとIEは、新しい日付を作成しようとすると、この日付文字列を正しく解析しません。 "2014/11/24 17:38:20.177Z" 彼らはその取り扱い方を知りません.177Z。Chromeでも動作します。


0

実際、Chromeはさまざまな文字列形式を処理するのにより柔軟です。文字列形式がわからなくても、Chromeはエラーなしで文字列を日付に正常に変換できます。このような:

  var outputDate = new Date(Date.parse(inputString));

しかし、FirefoxとSafariの場合、状況はさらに複雑になります。実際、Firefoxのドキュメントでは、次のようにすでに述べています:(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

RFC2822またはISO 8601の日付を表す文字列(他の形式も使用できますが、結果が予期しないものになる場合があります)。

したがって、FirefoxとSafariでDate.parseを使用する場合は注意が必要です。私はそれを扱うためにトリック手法を使用しています。(注:すべてのケースで常に正しいとは限りません)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

ここでは、まず2013-08-08 11:52:18 UTC2013-08-08T11:52:18Zに変換します。その後、その形式はFirefoxのドキュメントの単語に適合します。現時点では、Date.parseはどのブラウザーでも常に正しく機能します。


0

これは、上の私のために働いたものですFirefoxChrome

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

幸運を...


-1

Firefoxでは、無効な日付はすべてDateオブジェクトとしてDateオブジェクトとして返される1899-11-29T19:00:00.000Zため、ブラウザがFirefoxであるかどうかを確認してから、stringのDateオブジェクトを取得します"1899-11-29T19:00:00.000Z".getDate()。最後に日付と比較してください。


これは問題の原因を説明するのではなく、問題の結果を説明します。
Rytis 2014

-1

私は次の日付形式を使用しており、すべてのブラウザで機能します。

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.