Неверная дата в сафари



 alert(new Date('2010-11-29'));

chrome, ff не имеет проблем с этим, но safari кричит "недопустимая дата". Зачем ?

edit: ok, согласно комментариям ниже, я использовал синтаксический анализ строк и попробовал это:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

редактировать 22 марта 2018 : Похоже, люди все еще приземляются здесь-сегодня я бы использовал moment или date-fns и покончим с этим. Дата-ФНС очень много боли бесплатно и свет, а также.

183   13  

13 ответов:

шаблон yyyy-MM-dd не является официально поддерживаемым форматом для Date конструктор. Firefox, кажется, поддерживает его, но не рассчитывайте на другие браузеры, делающие то же самое.

вот некоторые из поддерживаемых строк, взятых из этот сайт:

  • ММ-ДД-гггг
  • гггг/ММ/ДД
  • ММ/ДД/гггг
  • мммм ДД, гггг
  • МММ ДД, гггг

DateJS кажется хорошим библиотека для разбора нестандартных форматов дат.

Edit: только что проверил стандарт ECMA-262. Цитата из раздела 15.9.1.15:

Формат Строки Даты И Времени

ECMAScript определяет строку формат обмена для даты-времени основанный на упрощении ИСО 8601 Расширенный Формат. Формат следующим образом: гггг-мм-ДДТЧЧ:мм:СС.sssZ Где поля следующие:

  • гггг это десятичные цифры года в григорианском календаре.
  • "-" (дефис) появляется буквально два раза в строке.
  • мм-это месяц года с 01 (январь) по 12 (декабрь).
  • DD-это день месяца с 01 по 31.
  • "T" появляется буквально в строке, чтобы указать начало элемент времени.
  • HH-это количество полных часов, прошедших с полуночи как два десятичный десятичные знаки.
  • ": "(двоеточие) появляется буквально дважды в строке.
  • мм-число минут с начала часа две десятичные цифры.
  • СС-это количество полных секунд с начала минуты как две десятичные цифры.
  • "."(точка) появляется буквально в строке.
  • sss-это количество полных миллисекунд с момента начала второй как три десятичные цифры. Оба этот." "и поле миллисекунд может быть опущен.
  • Z-смещение часового пояса, указанное как " Z "(для UTC) или " + " или "-" затем следует выражение времени hh: mm

этот формат включает в себя только даты формы:

  • гггг
  • ГГГГ-ММ
  • ГГГГ-ММ-ДД

Он также включает в себя только временные формы с добавлено дополнительное смещение часового пояса:

  • THH: mm
  • THH: mm: ss
  • THH: mm: ss.ССС

также включены "дата-время", которые может быть любое сочетание вышеперечисленного.

Итак, похоже, что YYYY-MM-DD включен в стандарт, но по какой-то причине Safari его не поддерживает.

обновление: после просмотра документация datejs, используя его, ваша проблема должна быть решена, используя код это:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");

для меня реализация новой библиотеки только потому, что Safari не может сделать это правильно, слишком много, и регулярное выражение является излишним. Вот это oneliner:

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

я столкнулся с аналогичной проблемой. Дата.Parse ("DATESTRING") работал на Chrome (версия 59.0.3071.115), но не Safari (версия 10.1.1 (11603.2.5) )

Safari:

Date.parse("2017-01-22 11:57:00")
NaN

Chrome:

Date.parse("2017-01-22 11:57:00")
1485115020000

решение, которое работало для меня, заменяло пространство в dateString на "T". ( например : дату.заменить (//g,"T"))

Safari:

Date.parse("2017-01-22T11:57:00")
1485086220000

Chrome:

Date.parse("2017-01-22T11:57:00")
1485115020000

обратите внимание, что ответ от Safari браузер на 8 часов (28800000ms) меньше, чем ответ, увиденный в браузере Chrome, потому что Safari вернул ответ в локальном TZ (который находится на 8 часов позади UTC)

как раз в этом ТЦ

Safari:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

Chrome:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

Я использую момент для решения проблемы. Например

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();

чтобы иметь решение, работающее в большинстве браузеров, вы должны создать свой объект даты с этим форматом

(year, month, date, hours, minutes, seconds, ms)

например:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

отлично работает с IE, FF, Chrome и Safari. Даже более старые версии.

IE Dev Center: объект даты (JavaScript)

Mozilla Dev Network: Дата

конвертировать строку в дату fromat (вы должны знать часовой пояс сервера)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

где + 08: 00 = часовой пояс от сервера

У меня была та же проблема.Тогда я использовал момент.Js.Проблема исчезла.

при создании момента из строки, мы сначала проверяем, если строка соответствует известным форматам ISO 8601, а затем возвращается к новой дате (строке), если известный формат не найден.

предупреждение: поддержка браузером синтаксического анализа строк является непоследовательной. Потому что нет никакой спецификации о том, какие форматы должны поддерживаться, что работает в некоторых браузерах не будет работать в другие обозреватели.

для последовательного анализа результатов, отличных от строк ISO 8601, вы должны использовать строку + формат.

например

var date= moment(String);

хотя вы можете надеяться, что браузеры будут поддерживать ISO 8601 (или его подмножества только для даты), это не так. Все браузеры, которые я знаю (по крайней мере, в американских/английских языках, которые я использую), могут анализировать ужасные США .

Если у вас уже есть части даты, вы можете вместо этого попробовать использовать дата.Мирового(). Если вы этого не сделаете, но вы должны использовать YYYY-MM-DD формат, я предлагаю использовать регулярное выражение для разбора кусков вы знайте, а затем передайте их Date.UTC().

используйте формат ниже, он будет работать на всех браузерах

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

/ / ваш вывод будет выглядеть так: "Ср 23 марта 2016 00:00: 00 GMT+0530 (IST)"

//Примечание это будет в текущем часовом поясе в этом случае обозначается IST, чтобы преобразовать в часовой пояс UTC вы можете включить

alert(dateObj.toUTCSting);

//ваш выход теперь хотел бы этого "Вт, 22 марта 2016 18: 30: 00 GMT"

обратите внимание, что теперь dateObj показывает время в формате GMT, также обратите внимание, что дата и время было изменено соответственно.

функция "toUTCSting" извлекает соответствующее время на Гринвичском меридиане. Это достигается путем установления разницы во времени между вашим текущим часовым поясом и часовым поясом Гринвичского меридиана.

В приведенном выше случае время до преобразования было 00: 00 часов и минут 23 марта 2016 года. И после преобразования с GMT+0530 (Ист) часов по Гринвичу (это в основном вычитает 5.30 часов из указанного отметка времени в этом случае) время отражает 18.30 часов 22 марта 2016 года (ровно на 5.30 часов позже первого раза).

далее для преобразования любого объекта даты в метку времени вы можете использовать

alert(dateObj.getTime());

//выход будет выглядеть примерно так: "1458671400000"

Это даст вам уникальную метку времени времени

Как насчет угона Date с fix-date? Никаких зависимостей, min + gzip = 280 B

лучший способ сделать это, используя следующий формат:

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

это поддерживается во всех браузерах и не доставит вам никаких проблем. Обратите внимание, что месяцы указаны с 0 до 11.

та же проблема, что и в Safari, и она была решена путем вставки этого в веб-страницу

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

надеюсь, что это будет работать и ваш случай тоже

спасибо

используйте формат 'mm/dd / yyyy'. Например: - новая дата('28.02.2015'). Он хорошо работает во всех браузерах.

    Ничего не найдено.

Добавить ответ:
Отменить.