2012-02-20 2 views
2

Существует ли строковый формат даты, из которой может быть создан объект Date (то есть new Date('date string')), который работает во всех браузерах и населенных пунктах/часовых поясах?Существует ли строковый формат Date, который работает во всех браузерах и во всех локациях?

Мы попытались использовать формат suggested in the HTML5 spec из yyyy-mm-ddThh:mm:ss+hh:mm, но столкнулись с проблемами с Safari и IE. Мы попытались использовать менее формальный формат mm/dd/yyyy hh:ss:mm, который работает, но, насколько мне известно, форматирование «за месяц до дня» может быть неоднозначным, если ваши настройки языка предполагают, что первое число будет днем ​​(неамериканские страны). Кроме того, он не устанавливает часовой пояс, который будет иметь проблемы с разными часовыми поясами.

+0

Я думаю, что было бы лучше и более стабильным (в долгосрочной перспективе, например, если появляется какой-то сумасшедший браузер или изменения спецификации) использовать некоторый пользовательский формат, вручную разбить его и передать его другой конструктор даты. – bezmax

+0

Где дата, начиная с? У вас есть контроль над экспортом разделов даты для передачи в конструкцию? Конструкция Date может принимать год, месяц, день, а также использовать такие методы, как 'setHours',' setMonth' и т. Д. –

+0

Думайте, что вам, возможно, придется написать свой собственный, использовать параметр конструктора миллисекунд или использовать что-то вроде http: //www.datejs.com/. –

ответ

3

Короче говоря, это почти невозможно обещание сделать как реализация является UA зависит. Я бы рекомендовал использовать iso8601 формат, как это будет стандартным идти вперед и использовать подкладку, чтобы помочь в дате разборе здесь, я написал для собственного использования:

(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); 
}; 

})(); 

Теперь вместо того, чтобы использовать Date.fromString(....) и все будут счастливы в земле ОЗ!

работает во всех основных браузерах, использовали эти ссылки:

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

https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats

надеюсь, что это помогает -ck

UPDATE: (1/21/2013)

Следует отметить, что поведение, что считается "стандартами поведения" собирается перейти от ECMAScript-262 v5.1 к ECMAScript-262 v6.0. См .:

Язык переведен с: Значение смещения по часовой стрелке отсутствует «Z».доЕсли смещение часового пояса отсутствует, дата-время интерпретируется как местное время.

В настоящее время рассол: хромовое, опера и мобильное сафари следуют за ES5.1, тогда как IE10, firefox и настольные сафари, похоже, следуют за ES6. Так что это своего рода раздельного решения прямо сейчас ... Так как таковые должно быть вторым ES6 стандартом-совместимого вариантом этого сценария, и здесь я пойти:

(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); 
    }; 

})(); 
+0

Согласен, ISO 8601 является * стандартом для дат и не зависит от локали. Дополнительная информация о стандарте: http://en.wikipedia.org/wiki/ISO_8601 –

0

Я не уверен, если есть string, но использование нового Date(2012,1,20,15,10,0) должно работать.То есть, Date(Years, Months, Days, Hours, Mins, Seconds), с month является 0 индексируется.

1

Afaik 'yyyy-mm-dd hh:mm:ss' - формат, с которого вы можете построить дату в каждом часовом поясе (используя new Date(''yyyy-mm-dd hh:mm:ss')).

например. (В Нидерландах)

new Date('1933-03-17 12:33:03'); 
    //=> Fri Mar 17 1933 12:33:03 GMT+0100 (West-Europa (standaardtijd)) 
new Date('1933-03-17 12:33:03').toUTCString() 
    //=> Fri, 17 Mar 1933 11:33:03 GMT 
+0

Это означает, что я буду обрабатывать локализацию на стороне сервера, чего я не буду делать. – Koviko

+1

??? Извините, я не понимаю, почему это подразумевает это. – KooiInc

+0

Предположим, сервер отвечает строкой «1933-03-17 12:33:03» пользователю в часовом поясе EST. Если я не обрабатываю локализацию на стороне сервера, то та же строка будет отправлена ​​пользователю в часовом поясе PST. Эта же строка представляет собой другой момент времени в зависимости от часового пояса пользователя. – Koviko

Смежные вопросы