2010-11-30 6 views
77
alert(new Date('2010-11-29')); 

chrome, ff не имеет проблем с этим, но сафари плачет «неверная дата». Зачем ?Недействительная дата на сафари

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

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 
+0

Только для других, имеющих аналогичную проблему: Я закончил работу с DateJS, которая решила мою проблему в целом. См. Принятый ответ для деталей. – Shrinath 2010-12-29 05:24:45

+1

используйте [moment.js] (http://momentjs.com/docs/), чтобы проанализировать метку времени. Особенно при работе с кросс-платформенным web – 2013-08-07 05:52:25

+1

Это старый вопрос. Начиная с ECMAScript 2015, строки только для даты ISO 8601 анализируются как UTC. Тем не менее, по-прежнему могут существовать более старые браузеры, которые либо не будут разбирать их вообще, либо рассматривать как локальные. – RobG 2017-03-14 06:07:02

ответ

103

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

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

  • ММ-дд-гггг
  • YYYY/ММ/дд
  • ММ/дд/гггг
  • MMMM дд, гггг
  • МММ дд, гггг

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

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

Дата Время Формат строки

ECMAScript определяет формат обмена строка для даты-времени основанный на упрощении ИСО 8601 расширенном формате. Формат следующим образом: YYYY-MM-DDThh: мм: ss.sssZ Где поля следующим образом:

  • YYYY это десятичные цифры года в григорианском календаре.
  • "-" (hyphon) появляется буквально дважды в строке.
  • MM - месяц года с 01 (январь) до 12 (декабрь).
  • DD - это день месяца с 01 по 31.
  • «T» появляется буквально в строке, чтобы указать начало элемента времени.
  • HH - это количество полных часов, прошедших с полуночи, в виде двух цифр .
  • ":" (двоеточие) появляется буквально дважды в строке.
  • мм - это число полных минут с начала часа как две десятичные цифры.
  • ss - количество полных секунд с начала минуты как две десятичные цифры.
  • "." (точка) появляется буквально в строке.
  • sss - это число полных миллисекунд с начала секунд, как три десятичных цифры. И "." и поле миллисекунд может быть опущено .
  • Z является смещение часового пояса определяется как «Z» (по Гринвичу) или как «+» или «-» , за которым следует время экспрессии чч: мм

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

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

также я ncludes времени только формы с дополнительный часовой пояс прилагается:

  • THH: мм
  • THH: мм: сс
  • THH: мм: СС.ссс

Также включены «дата-время», которое может быть любой комбинацией вышеуказанного.

Итак, кажется, что ГГГГ-ММ-ДД включен в стандарт, но по какой-то причине Safari не поддерживает его.

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

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"); 
+3

Формат ISO8601 используется в 5-м выпуске стандарта ECMAScript и еще не получил широкого распространения, самый безопасный способ пойти IMO, разобрать дату вручную :( – CMS 2010-11-30 06:25:09

+2

AAARRRGGGHHH !!! Он снова вернулся к ручному ..: ( – Shrinath 2010-11-30 07:09:25

+2

строки тоже не работают в сафари :( – Shrinath 2010-12-01 04:13:20

3

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

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

128

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

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

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

(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 Object (JavaScript)

Mozilla Dev Network: Date

4

Я была такая же issue.Then я использовал moment.Js .Problem исчез.

При создании момента из строки, мы сначала проверить, если строка спичка известных ISO 8601 форматов, а затем падает обратно на новую дату (строка), если известный формат не найден.

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

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

например.

var date= moment(String); 
-1

использовать формат 'мм/дд/гггг'. Например: - новая дата ('02/28/2015 '). Он хорошо работает во всех браузерах.

4

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

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

где +08: 00 = TIMEZONE от сервера

6

я использую время, чтобы решить эту проблему. Например

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

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

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

// Ваш выход теперь понравится «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»

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

1

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

5

У меня была аналогичная проблема. Date.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». (Пример: dateString.replace (//г, "Т"))

Сафари:

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

Хром:

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

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

Чтобы получить оба раза в одном TZ

Safari:

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

Chrome:

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

Той же проблема, стоящую перед в Safari и она была решена путем введения этого в вебе-странице

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

Надеется, что он будет работать и ваши case

Thanks

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