31

私は、モバイル デバイスをターゲットとするオフライン対応の Javascript サイトに取り組んでいます。そのようなモバイル デバイスの 1 つが IPhone です。

REST API (JSON オブジェクトのメンバー) から日付を解析しようとしています。私は使用しています

Date.parse("2010-03-15 10:30:00");

これは Android デバイスでは機能しますが、IPhone では無効な日付が表示されるだけです。

IPhone で解析できるように日付文字列をフォーマットするにはどうすればよいですか?

4

6 に答える 6

96

すべてのブラウザーが同じ日付形式をサポートしているわけではありません。最良の方法は、代わりに区切り文字 ( - および:) で文字列を分割し、結果の各配列項目をDateコンストラクターに渡すことです。

var arr = "2010-03-15 10:30:00".split(/[- :]/),
    date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);

console.log(date);
//-> Mon Mar 15 2010 10:30:00 GMT+0000 (GMT Standard Time)

これは、すべてのブラウザで同じように機能します。

于 2011-03-16T10:54:44.160 に答える
7

UTC/GMT 時間については、次を試すことができます。

    var arr = "2014-10-27T16:05:44+0000".split(/[\-\+ :T]/);

    var date = new Date();
    date.setUTCFullYear(arr[0]);
    date.setUTCMonth(arr[1] - 1);
    date.setUTCDate(arr[2]);
    date.setUTCHours(arr[3]);
    date.setUTCMinutes(arr[4]);
    date.setUTCSeconds(arr[5]);

日付オブジェクトは、使用時に適切なローカル タイムゾーンで表示されます。

于 2014-10-27T21:19:12.573 に答える
2

ISO 8601形式 に固執すると、運が良くなる可能性があります。

Date.parse("2010-03-15T10:30:00");

// e.g.
var d = new Date( Date.parse("2010-03-15T10:30:00") );
console.log( d.toString() ); //Mon Mar 15 2010 10:30:00 GMT+0000 (BST)
于 2011-03-16T10:57:36.863 に答える
1

アップデート2019-07-29:以下の既存のコンテンツは削除しませんが、この方法は使用しないことを強くお勧めします。私は自分の過ちから学びました。JavaScriptの既存のメソッドをオーバーライドしないでください。コードの移植性とパフォーマンスが低下します。ISO 8601(JSおよびほとんどのAPIの標準的な方法)を取得できない場合は、代わりにそのシステムを変更してください。または、オブジェクトを生成するために常に呼び出す必要がある独自の関数を記述しますDate


REST APIを修正して、適切なISO 8601日付時刻を送信できる場合、これを処理する適切な方法は、すべてのブラウザーがISO8601日付を処理できるようにする正規表現シムを使用することです。確かに遅いかもしれませんが、Javascriptで日付を処理することは、猫を水槽に入れようとするようなものです。

次のメソッドは、元のDate.parseメソッドをオーバーライドすることに注意してください。これは、大規模なプロジェクトや、さまざまな期待を持つ多くの開発者にとって問題になる可能性があります。自分が何をしているのかを知っている場合にのみ使用してください。

/**
 * Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
 * © 2011 Colin Snover <http://zetafleet.com>
 * Released under MIT license.
 */
(function (Date, undefined) {
    var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
    Date.parse = function (date) {
        var timestamp, struct, minutesOffset = 0;

        // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
        // before falling back to any implementation-specific date parsing, so that’s what we do, even if native
        // implementations could be faster
        //              1 YYYY                2 MM       3 DD           4 HH    5 mm       6 ss        7 msec        8 Z 9 ±    10 tzHH    11 tzmm
        if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
            // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
            for (var i = 0, k; (k = numericKeys[i]); ++i) {
                struct[k] = +struct[k] || 0;
            }

            // allow undefined days and months
            struct[2] = (+struct[2] || 1) - 1;
            struct[3] = +struct[3] || 1;

            if (struct[8] !== 'Z' && struct[9] !== undefined) {
                minutesOffset = struct[10] * 60 + struct[11];

                if (struct[9] === '+') {
                    minutesOffset = 0 - minutesOffset;
                }
            }

            timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
        }
        else {
            timestamp = origParse ? origParse(date) : NaN;
        }

        return timestamp;
    };
}(Date));

https://github.com/csnover/js-iso8601

于 2012-08-20T03:38:06.127 に答える