Неверная дата в сафари
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
и покончим с этим. Дата-fns очень много боли свободной и легкой также.
13 ответов
шаблон yyyy-MM-dd
не является официально поддерживаемым форматом для Date
конструктор. Firefox, похоже, поддерживает его, но не рассчитывайте на другие браузеры, делающие то же самое.
вот некоторые из поддерживаемых строк, взятых из этот сайт:
- ММ-ДД-гггг
- гггг/ММ/ДД
- ММ/ДД/гггг
- мммм ДД, гггг
- МММ ДД, гггг
DateJS кажется хорошим библиотека для разбора нестандартных форматов дат.
редактировать: только что проверил стандарт ECMA-262. Цитата из раздела 15.9.1.15:
Формат Строки Даты И Времени
ECMAScript определяет строку формат обмена для даты и времени на основе упрощения ISO 8601 Расширенный Формат. Формат следующим образом: гггг-мм-ДДТЧЧ:мм:СС.sssZ Где поля следующие:
- гггг является десятичной цифрой года в григорианском календаре.
- " - " (гифон) появляется буквально дважды в строке.
- мм-месяц года с 01 (январь) по 12 (декабрь).
- DD-это день месяца с 01 по 31.
- " T " появляется буквально в строке, чтобы указать начало элемент времени.
- HH-количество полных часов, прошедших с полуночи, как два десятичный десятичные знаки.
- ": "(двоеточие) появляется буквально дважды в строке.
- mm-количество полных минут с начала часа как две десятичные цифры.
- ss-это количество полных секунд с момента начала минуты как две десятичные цифры.
- "."(точка) появляется буквально в строке.
- sss-это количество полных миллисекунд с момента начала второй в виде трех десятичных цифр. Оба этот." "и поле миллисекунд может быть опущен.
- Z-смещение часового пояса, указанное как " Z "(для UTC) или " + " или "-" затем следует выражение времени hh: mm
этот формат включает в себя только даты формы:
- гггг
- ГГГГ-ММ
- ГГГГ-ММ-ДД
Он также включает формы только для времени с дополнительное смещение часового пояса:
- стороны thh:мм
- THH: mm: ss
- THH: mm: ss.sss
также включены "дата-время", которые может быть любая комбинация из вышеперечисленного.
Итак, кажется, что гггг-ММ-ДД включен в стандарт, но по какой-то причине 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) )
сафари:
Date.parse("2017-01-22 11:57:00")
NaN
Chrome:
Date.parse("2017-01-22 11:57:00")
1485115020000
решение, которое работало для меня, заменяло пространство в dateString на "T". (пример: dateString.заменить (//g, "T"))
сафари:
Date.parse("2017-01-22T11:57:00")
1485086220000
Chrome:
Date.parse("2017-01-22T11:57:00")
1485115020000
обратите внимание, что ответ от Safari браузер на 8hrs (28800000ms) меньше, чем ответ, увиденный в браузере Chrome, потому что Safari вернул ответ в локальном TZ (который находится на 8hrs позади UTC)
как раз в этом ТЦ
сафари:
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. Даже более старые версии.
преобразовать строку в дату 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, вы должны использовать формат String +.
например
var date= moment(String);
хотя вы можете надеяться, что браузеры будут поддерживать ISO 8601 (или их подмножества только по дате), это не так. Все браузеры, которые я знаю (по крайней мере, в США/английском языке, который я использую), могут анализировать ужасные США .
Если у вас уже есть части даты, вы можете вместо этого попробовать использовать дата.UTC (). Если нет, но вы должны использовать 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 (IST) часов в GMT (он в основном вычитает 5.30 часов из данного отметка времени в этом случае) время отражает 18.30 часов 22 марта 2016 года (ровно на 5.30 часов после первого раза).
далее для преобразования любого объекта даты в метку времени вы можете использовать
alert(dateObj.getTime());
//выход будет выглядеть примерно так же, как этот "1458671400000"
Это даст вам уникальную метку времени времени
Как насчет угона 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'). Он хорошо работает во всех браузерах.