Недействительная дата в сафари
alert(new Date('2010-11-29'));
chrome, ff не имеет проблем с этим, но сафари выкрикивает "недопустимая дата". Зачем?
edit: хорошо, согласно комментариям ниже, я использовал разбор строк и попробовал это:
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
edit 22 марта 2018: Похоже, что люди все еще приземляются здесь - Сегодня я бы использовал moment
или date-fns
и покончим с этим. Date-fns также очень безболезненный и легкий.
Ответы
Ответ 1
Шаблон yyyy-MM-dd
не является официально поддерживаемым форматом для конструктора Date
. Firefox, кажется, поддерживает это, но не рассчитывайте на то, что другие браузеры делают то же самое
Вот некоторые из поддерживаемых строк, взятых с этого сайта:
- ММ-дд-гггг
- дд гггг/ММ/
- ММ/дд/гггг
- ММММ дд, гггг
- МММ дд, гггг
DateJS кажется хорошей библиотекой для анализа нестандартных форматов дат.
Редактировать: только что проверил стандарт ECMA-262. Цитата из раздела 15.9.1.15:
Дата Время Формат строки
ECMAScript определяет формат обмена строк для даты и времени на основе упрощенного расширенного формата ISO 8601. Формат выглядит следующим образом: ГГГГ-ММ-ДДЧЧ: мм: сс.сссZ Где следующие поля:
- YYYY - десятичные цифры года в григорианском календаре.
- "-" (гифон) появляется буквально дважды в строке.
- MM - месяц года с 01 (январь) до 12 (декабрь).
- ДД это день месяца с 01 по 31.
- Буква "Т" появляется буквально в строке, чтобы указать начало элемента времени.
- ЧЧ - количество полных часов, прошедших с полуночи в виде двух десятичных цифр.
- ":" (двоеточие) появляется буквально дважды в строке.
- мм - количество полных минут с начала часа в виде двух десятичных цифр.
- ss - количество полных секунд с начала минуты в виде двух десятичных цифр.
- "" (точка) появляется буквально в строке.
- sss - это число полных миллисекунд с начала секунды в виде трех десятичных цифр. Оба "." и поле миллисекунд может быть опущено.
- Z - это смещение часового пояса, указанное как "Z" (для UTC) или "+" или "-", за которым следует выражение времени чч: мм
Этот формат включает формы только для даты:
Он также включает в себя только временные формы с добавлением необязательного смещения часового пояса:
- THH: мм
- THH: мм: сс
- THH: мм: СС.ссс
Также включены "дата-время", которые могут представлять собой любую комбинацию из вышеперечисленного.
Похоже, что 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");
Ответ 2
Для меня реализация новой библиотеки просто потому, что Safari не может сделать это правильно, слишком много, и регулярное выражение переполнено.
Вот oneliner:
console.log (new Date('2011-04-12'.replace(/-/g, "/")));
Ответ 3
Я столкнулся с аналогичной проблемой. Date.Parse("DATESTRING")
работал на Chrome (версия 59.0.3071.115), но не на Safari (версия 10.1.1 (11603.2.5))
Сафари:
Date.parse("2017-01-22 11:57:00")
NaN
Хром:
Date.parse("2017-01-22 11:57:00")
1485115020000
Решение, которое работало для меня, заключалось в замене пробела в dateString на "T"
. (пример: dateString.replace(//g,"T")
)
Сафари:
Date.parse("2017-01-22T11:57:00")
1485086220000
Хром:
Date.parse("2017-01-22T11:57:00")
1485115020000
Обратите внимание, что ответ от браузера Safari на 8 часов (28800000 мс) меньше, чем ответ браузера Chrome, потому что Safari возвратил ответ в локальном TZ (что на 8 часов позже UTC)
Чтобы получить оба раза в одном и том же TZ
Сафари:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
Хром:
Date.parse("2017-01-22T11:57:00Z")
1485086220000
Ответ 4
Я использую момент для решения проблемы.
Например
var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
Ответ 5
Чтобы решение работало в большинстве браузеров, вы должны создать объект date с этим форматом.
(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: объект Date (JavaScript)
Сеть разработчиков Mozilla: Дата
Ответ 6
конвертировать строку в Date fromat (вы должны знать часовой пояс сервера)
new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()
где +08: 00 = timeZone с сервера
Ответ 7
У меня была такая же проблема. Затем я использовал moment.Js. Проблема исчезла.
При создании момента из строки мы сначала проверяем, является ли строка соответствует известным форматам ISO 8601, затем возвращается к новой дате (строка), если известный формат не найден.
Предупреждение. Поддержка браузера для разбора строк непоследовательна. Потому как нет спецификаций, по которым должны поддерживаться форматы, какие работы в некоторых браузерах не будут работать в других браузерах.
Для согласованных результатов, анализирующих все, кроме строк ISO 8601, вы должны использовать String + Format.
например.
var date= moment(String);
Ответ 8
Хотя вы можете надеяться, что браузеры будут поддерживать ISO 8601 (или их подмножества только для даты), это не так. Все браузеры, о которых я знаю (по крайней мере, в американских и английских местах, которые я использую), могут разбирать ужасный формат US MM/DD/YYYY
.
Если у вас уже есть части даты, вы можете вместо этого использовать Date.UTC(). Если вы этого не сделаете, но вы должны использовать формат YYYY-MM-DD
, я предлагаю использовать регулярное выражение для анализа фрагментов, которые вам известны, а затем передать их в Date.UTC()
.
Ответ 9
Используйте следующий формат, он будет работать во всех браузерах
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.03.2006 00:00:00 GMT + 0530 (IST)"
//Обратите внимание, что это будет в текущем часовом поясе в этом случае, обозначенном IST, для преобразования в часовой пояс UTC вы можете включить
alert(dateObj.toUTCSting);
//Ваш результат теперь понравится "Tue, 22 Mar 2016 18:30:00 GMT"
Обратите внимание, что теперь dateObj показывает время в формате GMT, также обратите внимание, что дата и время были соответственно изменены.
Функция "toUTCSting" получает соответствующее время в гривневом меридиане. Это достигается путем установления разницы во времени между вашим текущим часовым поясом и часовым поясом Greenwich Meridian.
В приведенном выше случае время до конвертации составляло 00:00 часов и минут 23 марта 2016 года. И после перехода с GMT + 0530 (IST) часов на GMT (он в основном вычитает 5:30 часов от данного отметка времени в этом случае) время отражается 18.30 часов 22 марта 2016 года (ровно 5.30 часов в первый раз).
Чтобы преобразовать любой объект даты в метку времени, вы можете использовать
alert(dateObj.getTime());
//вывод будет похож на этот "1458671400000"
Это даст вам уникальную временную метку времени
Ответ 10
Как насчет hijack Date
с fix-date? Без зависимостей, min + gzip = 280 B
Ответ 11
Лучший способ сделать это - использовать следующий формат:
new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);
Это поддерживается во всех браузерах и не доставит вам никаких проблем. Обратите внимание, что месяцы написаны от 0 до 11.
Ответ 12
Та же самая проблема, с которой сталкиваются в Safari, была решена путем вставки этого в веб-страницу
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>
Надеюсь, это будет работать и ваш случай тоже
Спасибо
Ответ 13
Как ранее упоминалось @nizantz, использование Date.parse() не помогло мне в Safari. После небольшого исследования я узнал, что свойство lastDateModified для объекта File устарело и больше не поддерживается Safari. Использование свойства lastModified объекта File решило мои проблемы. Конечно, не нравится, когда плохая информация найдена в Интернете.
Спасибо всем, кто внес вклад в этот пост, который помог мне пойти по пути, который мне нужен, чтобы узнать о моей проблеме. Если бы не эта информация, я бы, наверное, не разобрался в своей основной проблеме. Может быть, это поможет кому-то еще в моей аналогичной ситуации.
Ответ 14
Я также сталкиваюсь с той же проблемой в браузере Safari
var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN returned and in Safari you get ‘Invalid Date
Вот решение:
var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC
Ответ 15
используйте формат 'mm/dd/yyyy'. Например: - новая дата ('02/28/2015 '). Он хорошо работает во всех браузерах.