2013-05-17 9 views
9

に無効な日付を返す()関数:私はChromeでこれを実行すると日のSafariとFirefox

date = new Date("2013-05-12 20:00:00"); 
formattedDate = new Date(date.getFullYear(),date.getMonth(),date.getDate()); 

それは出力:

Sun May 12 2013 00:00:00 GMT-0700 (PDT) 

ものですどのしかし、私はFirefoxやSafariでこれを実行すると、私は必要があります

Invalid Date 

いずれか1つの回避策を提案することができます。ライブラリ、正規表現、または文字列の操作が不要な場合は余分なポイント。

答えて

0

完全に動作させるには、日付と時刻の間に「T」が必要だと思います。

date = new Date("2013-05-12T20:00:00"); 

は仕様で許可されてかなりの数の可能な日時フォーマットがあり、私はすべてのブラウザは、すべての可能性を提供するとは思いません。 Firefoxはクロスブラウザ本当に安全であるためにhttps://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse

を参照してください、あなたはあなたの日付フォーマットは、いくつかのための標準ではありませんRFC2822/IETF日付構文(クロームはあなたに出て戻って吐いたと基本的に同じ)

8

をしようとする場合がありますブラウザ。カスタム日付時刻形式を解析するには、別々の値に分割して、別のDateコンストラクタを使用してyear, month, day, hours, minutes, secondsを受け入れ、クロスブラウザに準拠させることができます。あなたのケースの場合には、このようなものになります。

var date = "2013-05-12 20:00:00", 
    values = date.split(/[^0-9]/), 
    year = parseInt(values[0], 10), 
    month = parseInt(values[1], 10) - 1, // Month is zero based, so subtract 1 
    day = parseInt(values[2], 10), 
    hours = parseInt(values[3], 10), 
    minutes = parseInt(values[4], 10), 
    seconds = parseInt(values[5], 10), 
    formattedDate; 

formattedDate = new Date(year, month, day, hours, minutes, seconds); 

ここhttp://jsbin.com/ewozew/1/edit

12

例の作業値2013-05-12 20:00:00ISO8601で指定された1つのいくつかの有効な形式であるが、それはRFC3339で定義されたプロファイルを使用するのが最適です、これISO8601のサブセットです。

これは、Tセパレータと、タイムゾーンのオフセットの両方を持つ必要があることを意味します。これは、数値またはUTCを指定するZです。換言すれば、2013-05-12T20:00:00-07:00の値、または同等の2013-05-13T03:00:00Zの値を使用する必要があります。

正しい形式の入力値を持っているかどうかにかかわらず、ブラウザの互換性の問題が発生します。現代のブラウザーはすべてISO8601をサポートしていますが、いくつかの点で異なった解釈をしています。たとえば、Google ChromeでTを省略すると、末尾にZがあっても現地時間として解析されます。 Internet Explorerで、同じ値のTを省略すると、無効な日付エラーが返されます。

より良いアプローチは、これらの相違点を抽象化するライブラリを使用することです。そのため、ブラウザの不調期ではなくアプリケーションに集中できます。私が知っている最高のライブラリはmoment.jsです。 ISO日付の完全なサポートに加えて、カスタム書式文字列で必要な方法で入力を解析できます。他にもたくさんの機能があります。私は非常にあなたが一見をお勧めします。

moment.js使用して、次の操作を行うことができます:

// from a full date-time-offset ISO8601/RFC3339 value 
var m = moment('2013-05-12T20:00:00-07:00'); 

// or from your custom value, with explicit formatting 
// this will assume the local time zone because you didn't specify one 
var m = moment('2013-05-12 20:00:00','YYYY-MM-DD HH:mm:ss'); 

// then you can output it in a custom format if you like 
m.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, May 12th 2013, 8:00:00 pm" 

を私の知る限りでは、moment.js作品すべてのブラウザで - IE6のような古いものを含みます。

+0

Moment.JS私は[moment.js](http://momentjs.com/)の使用は、これらの問題に対処し同意Awesum –

+0

です。 –

0

なぜあなたのコードの先頭にfix-dateDateをハイジャックしませんか?

import 'fix-date' // that's ok! 
関連する問題