новая дата() работает в Chrome, а не Firefox
Я создаю строку datetime, которая выглядит так:2010-07-15 11:54:21
и со следующим кодом я получаю недопустимую дату в Firefox, но отлично работает в Chrome
var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);
в firefox date1 дает мне недопустимую дату,но в chrome его работа просто отлично, что было бы основной причиной?
12 ответов:
вы не можете создать экземпляр объекта даты любым способом. Это должно быть определенным образом. Вот несколько допустимых примеров:
new Date() // current date and time new Date(milliseconds) //milliseconds since 1970/01/01 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds)или
d1 = new Date("October 13, 1975 11:13:00") d2 = new Date(79,5,24) d3 = new Date(79,5,24,11,33,0)хром должен быть просто более гибким.
Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
С apsillers комментарий:
спецификация EMCAScript требуется ровно одна дата формат (т. е. гггг-мм-ДДТЧЧ:мм:СС.sssZ), но пользовательские форматы даты могут свободно поддерживаться реализацией: "если строка не соответствует этому формату [определенному ECMAScript], функция может вернуться к любой эвристике, специфичной для реализации, или форматам даты, специфичным для реализации." Chrome и FF просто имеют разные "форматы дат для конкретной реализации."
это работает во всех браузерах -
новая дата ('2001/01/31 12: 00: 00 AM'): гггг-мм-ДДТЧЧ:мм:СС.СССnew Date('2001-01-31 12:00:00')подробности:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
это работает в большинстве браузеров, а также
new Date('2001/01/31 12:00:00')это формат
"yyyy/MM/dd HH:mm:ss"
Вариант 1 :
предположим, что ваш timestring имеет формат, который выглядит следующим образом:
'2016-03-10 16:00:00.0'в этом случае вы можете сделать простое регулярное выражение, чтобы преобразовать его в
ISO 8601:'2016-03-10 16:00:00.0'.replace(/ /g,'T')это приведет к следующему выводу:
'2016-03-10T16:00:00.0'это стандартный формат datetime, и поэтому поддерживается всеми браузерами:
document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USEВариант 2 :
предположим, что ваш timestring имеет формат, который выглядит так :
'02-24-2015 09:22:21 PM'здесь, вы можете сделать следующее регулярное выражение :
'02-24-2015 09:22:21 PM'.replace(/-/g,'/');это тоже создает формат, поддерживаемый всеми браузерами:
document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USEВариант 3 :
предположим, что у вас есть временная строка, которую нелегко настроить на один из хорошо поддерживаемых стандартов.
в этом случае лучше всего просто разделить вашу временную строку на разные части и использовать их как отдельные параметры для
Date:document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE
Если вы все еще хотите создать дату с помощью тире, можно использовать следующий формат:
var date = new Date('2013-08-31T17:00:00Z')но имейте в виду, что он создает время в соответствии с UTC. Это означает, что если вы живете в часовом поясе GMT+3 (на 3 часа раньше GMT), он добавит это смещение часового пояса к времени. Таким образом, приведенный выше пример будет иметь это значение, если GMT+3 (Обратите внимание, что это час 20:00, а не 17:00):
Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)обязательно добавьте букву " Z " в конце, потому что в противном случае Chrome и Firefox будут проанализируйте строку по-разному (один добавит смещение по времени, а другой-нет).
у меня была аналогичная проблема как в Firefox, так и в Safari при работе с AngularJS. Например, если дата, возвращенная из Angular, выглядела так:
2014-06-02 10:28:00используя этот код:
new Date('2014-06-02 10:28:00').toISOString();возвращает недопустимую ошибку даты в Firefox и Safari. Однако в Chrome работает нормально. Как указано в другом ответе, Chrome, скорее всего, просто более гибок с разбором строк даты.
моей конечной целью было отформатировать дату определенным образом. Я нашел отличная библиотека, которая обрабатывала как проблему совместимости между браузерами, так и проблему форматирования даты. Библиотека называется момент.js.
С помощью этой библиотеки следующий код работает правильно во всех браузерах, которые я тестировал:
moment('2014-06-02 10:28:00').format('MMM d YY')Если вы хотите включить эту дополнительную библиотеку в свое приложение, вы можете легко построить свою строку даты, избегая возможных проблем с совместимостью браузера. В качестве бонуса у вас будет хороший способ легко формат, сложение, вычитание и т. д. даты, если это необходимо.
Это должно работать для вас:
var date1 = new Date(year, month, day, hour, minute, seconds);Я должен был создать дату сформировать строку, поэтому я сделал это так:
var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));помните, что месяцы в javascript от 0 до 11, поэтому вы должны уменьшить значение месяца на 1, например:
var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
одна ситуация, с которой я столкнулся, была при работе с миллисекундами. FF и IE не будут правильно анализировать эту строку даты при попытке создать новую дату.
"2014/11/24 17:38:20.177Z"Они не знают, как обращаться.177Z. Хром будет работать, хотя.
На самом деле, Chrome является более гибким, чтобы иметь дело с различным форматом строки. Даже если вы не выясните его формат строки, Chrome по-прежнему может успешно конвертировать строку в дату без ошибок. Вот так:
var outputDate = new Date(Date.parse(inputString));но для Firefox и Safari все становится сложнее. На самом деле, в документе Firefox, он уже говорит: (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
строку представление даты RFC2822 или ISO 8601 (могут использоваться другие форматы, но результаты могут быть неожиданными).
Итак, когда вы хотите использовать дата.разбор в Firefox и Safari, вы должны быть осторожны. Для меня, я использую трюк метод, чтобы справиться с этим. (Примечание: это может быть не всегда правильно для всех случаев)
if (input.indexOf("UTC") != -1) { var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z"; date = new Date(Date.parse(tempInput)); }здесь он преобразует 2013-08-08 11:52: 18 UTC до 2013-08-08T11: 52: 18Z во-первых, а затем его формат подходит слова в Документ Firefox. На этот раз свидание.разбор будет всегда прав в любом браузере.
простое решение, это работает со всеми браузерами,
var StringDate = "24-11-2017" var DateVar = StringDate.split("-"); var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]); alert(DateVal);
в Firefox любая недопустимая дата возвращается как объект даты как дата
1899-11-29T19:00:00.000Z, поэтому проверьте, является ли браузер Firefox, а затем получите объект даты строки"1899-11-29T19:00:00.000Z".getDate(). Наконец, сравните его с датой.
я использовал следующий формат даты, и он работает во всех браузерах.
var target_date = new Date("Jul 17, 2015 16:55:22").getTime(); var days, hours, minutes, seconds; var countdown = document.getElementById("countdown"); remaining = setInterval(function () { var current_date = new Date().getTime(); var seconds_left = (target_date - current_date) / 1000; days = parseInt(seconds_left / 86400); seconds_left = seconds_left % 86400; hours = parseInt(seconds_left / 3600); seconds_left = seconds_left % 3600; minutes = parseInt(seconds_left / 60); seconds = parseInt(seconds_left % 60); countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, " + minutes + " minute, " + seconds + " second.</b>"; }, 1000);
Comments