Новая дата() работает в 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 ее работа прекрасна, какова будет основная причина?
Ответы
Ответ 1
Вы не можете создать экземпляр объекта даты любым способом. Это должно быть определенным образом. Вот несколько примеров:
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)
Chrome должен быть более гибким.
Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Из apsillers комментарий:
спецификация EMCAScript требует ровно одного формата даты (т.е. YYYY-MM-DDTHH: mm: ss.sssZ), но пользовательские форматы дат могут свободно поддерживаться в реализации: "Если String не соответствует этому [ECMAScript-определенному] формату, функция может вернуться к любому специфичные для реализации эвристики или конкретные форматы дат реализации". Chrome и FF просто имеют разные "форматы дат реализации".
Ответ 2
Это работает во всех браузерах -
новая дата ('2001/01/31 12:00:00 AM')
new Date('2001-01-31 12:00:00')
Формат: YYYY-MM-DDTHH: mm: ss.sss
Подробности: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Ответ 3
Это работает и в большинстве браузеров.
new Date('2001/01/31 12:00:00')
Это формат
"yyyy/MM/dd HH:mm:ss"
Ответ 4
Если вы все еще хотите создать дату с помощью тире, вы можете использовать этот формат:
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 будут анализировать строку по-разному (один добавит смещение по времени, а другой не будет).
Ответ 5
Вариант 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'
Это стандартный формат даты и времени, поддерживаемый всеми браузерами:
document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE
Ответ 6
У меня была аналогичная проблема в Firefox и Safari при работе с AngularJS. Например, если дата, возвращаемая из Angular, выглядит так:
2014-06-02 10:28:00
используя этот код:
new Date('2014-06-02 10:28:00').toISOString();
возвращает неверную ошибку даты в Firefox и Safari. Однако в Chrome он отлично работает. Как сказал еще один ответ, Chrome скорее всего будет более гибким с синтаксическими строками даты.
Моя конечная цель состояла в том, чтобы форматировать дату определенным образом. Я нашел отличную библиотеку, которая обрабатывала проблему совместимости с кросс-браузером и проблему форматирования даты. Библиотека называется moment.js.
Используя эту библиотеку, следующий код работает правильно во всех проверенных вами браузерах:
moment('2014-06-02 10:28:00').format('MMM d YY')
Если вы хотите включить эту дополнительную библиотеку в свое приложение, вы можете легко создать свою строку даты, избегая при этом проблем с совместимостью с браузером. В качестве бонуса у вас будет хороший способ легко форматировать, добавлять, вычитать и т.д. При необходимости.
Ответ 7
Это должно сработать для вас:
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));
Ответ 8
Одна ситуация, с которой я столкнулся, заключалась в работе с миллисекундами. FF и IE не будут корректно анализировать эту строку даты при попытке создать новую дату.
"2014/11/24 17:38:20.177Z"
Они не знают, как обращаться с .177Z
. Chrome работает, хотя.
Ответ 9
На самом деле Chrome более гибкий, чтобы иметь дело с различными строковыми форматами. Даже если вы не знаете его формат String, Chrome по-прежнему может успешно преобразовывать String в Date без ошибок. Вот так:
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 (могут использоваться другие форматы, но результаты могут быть неожиданными).
Итак, если вы хотите использовать Date.parse в 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. На данный момент Date.parse всегда будет в любом браузере.
Ответ 10
В Firefox любая недопустимая дата возвращается как объект Date как Date 1899-11-29T19:00:00.000Z
, поэтому проверьте, является ли браузер Firefox, а затем получает объект Date строки "1899-11-29T19:00:00.000Z".getDate()
. Наконец сравните его с датой.
Ответ 11
Я использовал следующий формат даты и работал во всех браузерах.
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);