SORU
27 NİSAN 2011, ÇARŞAMBA


Tarih ile ISO 8601 Tarih Dize destek ayrıştırma tarayıcılar.JavaScript: ayrıştırma

"2011-04-26T13:16:50Z" IE8 ve Safari 5, ancak Chrome 10, FF4 çalıştı. ISO 8601 tarih ayrıştırmak için başarısız oldum Destek oldukça karışık gibi görünüyor?

Kimse bu biçimde ayrıştırabilir olan gerçek durumunu biliyor mu? IE6 ve 7 de başarısız olur sanıyorum.

var d = Date.parse("2011-04-26T13:16:50Z");

CEVAP
20 ŞUBAT 2012, PAZARTESİ


Eğer bazı testler ile gerekirse, sadece takoz diyorum

işte ben zaten yazılı:

(function() {

var d = window.Date,
    regexIso8601 = /^(\d{4}|\ \d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\- ])(\d{2}):(\d{2}))?)?)?)?$/;

if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
    d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
    d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
    d.parse('2011-11-29') !== 1322524800000 ||
    d.parse('2011-11') !== 1320105600000 ||
    d.parse('2011') !== 1293840000000) {

    d.__parse = d.parse;

    d.parse = function(v) {

        var m = regexIso8601.exec(v);

        if (m) {
            return Date.UTC(
                m[1],
                (m[2] || 1) - 1,
                m[3] || 1,
                m[4] - (m[8] ? m[8]   m[9] : 0) || 0,
                m[5] - (m[8] ? m[8]   m[10] : 0) || 0,
                m[6] || 0,
                ((m[7] || 0)   '00').substr(0, 3)
            );
        }

        return d.__parse.apply(this, arguments);

    };
}

d.__fromString = d.fromString;

d.fromString = function(v) {

    if (!d.__fromString || regexIso8601.test(v)) {
        return new d(d.parse(v));
    }

    return d.__fromString.apply(this, arguments);
};

})();

ve kodunuzda her zaman new Date(...) yerine Date.fromString(...) kullanın

eğer dolgu kullanılacaksa görmek için bir tarayıcı testi:

http://jsbin.com/efivib/1/edit

işleri tüm ana tarayıcılarda, bu başvuruları:

http://dev.w3.org/html5/spec/common-microsyntaxes.html

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

http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx

!- microsoft görüntülemek için bir günlük gerektirir bağlayın:

9 basamaklı sayıları 3 dışında milisaniye başarısız oldu: (IE10 sabit) https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats

IE10 zaman dilimi atlandığında hala (1/17/2013) başarısız (ECMA göre, bu Z veya UTC defalt, yerel): https://connect.microsoft.com/IE/feedback/details/776783/date-parse-and-new-date-fail-on-valid-formats

Bu standart artık gelecekte olacak / nerede olduğunu ve IE ekibi, IE10 bunların uygulanması teknik olarak hatalı olduğunu kabul etmek alamıyorum neden önem veriyorsan bunu okuyun

ECMA-262 v6.0 hareket edecek bir miktar daha ıso8601 uyumlu sürümü "eğer saat dilimi göstergesi atlanmış, varsayalım yerel saat"... yani işte bir tutarsızlık, bu uygulama, chrome, mobile safari ve opera tüm takip ECMA-262 v5.IE10, firefox, safari masaüstü ise 1, Daha fazla ıso8601 uyumlu ECMA-262 v6 aşağıdaki gibi görünüyor.0 şartname... bu az söylemek kafa karıştırıcı. Krom veya mobil safari tetiği çek ve ES6 uygulanması, bu uygulama ile ES5 bırakarak gitmek gerektiğini düşünüyorum.Azınlıkta 1. Bu "" sürümü bulamadım gerçi 5.1. bulma listelenen okudum Ben daha bu görüşüne şey için erken çekerek tetiğe ES6 henüz, ama ben de bu görüşüne kod ihtiyaçlarına pratik bir çözüm değil, ideal ve nereye taşımak için tarayıcı makinesi taşımak için. Aşağıda "" sürümü, bu kod... . geleceği çok 50/50 hemen bir seçim gibi görünüyor, dedi,

Aynı zamanda düzelecektir kodu her iki sürümü "uyumsuz" altlıklar ne yana diğer bir davranışı eşleştirmek için tarayıcılar ;) . bahsetmeliyiz

BURADA BİR UYARLANMIŞ, ECMA-262 v6 İLE UYUMLU.0 (JavaScript Gelecek)

burada ilgili bölümlere bakın: (bu bulabildiğim spec sadece online html sürümü) 16**

(function() {

    var d = window.Date,
        regexIso8601 = /^(\d{4}|\ \d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\- ])(\d{2}):(\d{2}))?)?)?)?$/,
        lOff, lHrs, lMin;

    if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
        d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
        d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
        d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
        d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
        d.parse('2011-11-29') !== 1322524800000 ||
        d.parse('2011-11') !== 1320105600000 ||
        d.parse('2011') !== 1293840000000) {

        d.__parse = d.parse;

        lOff = -(new Date().getTimezoneOffset());
        lHrs = Math.floor(lOff / 60);
        lMin = lOff % 60;

        d.parse = function(v) {

            var m = regexIso8601.exec(v);

            if (m) {
                return Date.UTC(
                    m[1],
                    (m[2] || 1) - 1,
                    m[3] || 1,
                    m[4] - (m[8] ? m[9] ? m[9]   m[10] : 0 : lHrs) || 0,
                    m[5] - (m[8] ? m[9] ? m[9]   m[11] : 0 : lMin) || 0,
                    m[6] || 0,
                    ((m[7] || 0)   '00').substr(0, 3)
                );
            }

            return d.__parse.apply(this, arguments);

        };
    }

    d.__fromString = d.fromString;

    d.fromString = function(v) {

        if (!d.__fromString || regexIso8601.test(v)) {
            return new d(d.parse(v));
        }

        return d.__fromString.apply(this, arguments);
    };

})();

umarım bu yardımcı olur -ck

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Marques Brownlee

    Marques Brow

    21 Mart 2008
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • PhoneBuff

    PhoneBuff

    10 HAZİRAN 2011