11

次の方法で日付をフォーマットしています。

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

これを Chrome で実行すると、次のように出力されます。

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

これは私が必要とするものですが、これを Firefox または Safari で実行すると、

Invalid Date

誰でもこれに対する回避策を提案できますか。ライブラリ、正規表現、または文字列操作を必要としない場合は、余分なポイント。

4

5 に答える 5

14

値はISO86012013-05-12 20:00:00で指定されたいくつかの有効な形式の 1 つですが、ISO8601 のサブセットであるRFC3339で定義されたプロファイルを使用することをお勧めします。

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

入力値が正しくフォーマットされているかどうかに関係なく、ブラウザの互換性の問題が発生します。最新のブラウザはすべて ISO8601 をサポートしていますが、解釈が異なるものもあります。例えば、Google Chrome では、末尾Tに があっても を省略すると現地時間として解析されます。ZInternet 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 などの古いブラウザを含むすべてのブラウザで動作します。

于 2013-05-18T03:16:41.693 に答える
9

一部のブラウザでは、日付形式が標準ではありません。カスタムの日時形式を解析するには、それを個別の値に分割し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

于 2013-05-17T20:25:28.437 に答える