web-dev-qa-db-ja.com

新しいDate()はChromeで動作しますが、Firefoxでは動作しません

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

そして、次のコードを使用すると、Firefoxでは無効な日付が取得されますが、Chromeでは正常に動作します

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

Firefoxでは、date1は無効な日付を私に与えていますが、chromeでうまく動作し、主な原因は何ですか?

83
pixeldev

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

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-defined]形式に適合しない場合、関数は実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックする場合があります。 "ChromeとFFには、単に「実装固有の日付形式」があります。」

76
Chris Laplante

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

新しい日付( '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

21
Tahin Rahman

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

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

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

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

オプション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:

よくサポートされている標準のいずれかに簡単に調整できない時間文字列があるとします。

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

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

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

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)

それ以外の場合ChromeとFirefoxは文字列を異なる方法で解析します(1つは時間オフセットを追加し、もう1つは追加しません)。

8
Gabrielius

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')

この追加のライブラリをアプリに追加する場合、ブラウザの互換性の問題を回避しながら、日付文字列をより簡単に作成できます。ボーナスとして、必要に応じて日付の書式設定、追加、減算などを簡単に行うことができます。

5
SnapShot

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

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));
4
Bartek Kosa

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

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

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

1
bjo

実際、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
Haimei