Подтвердить что ты не робот

Новая дата() работает в 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 ее работа прекрасна, какова будет основная причина?

4b9b3361

Ответ 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 просто имеют разные "форматы дат реализации".

Ответ 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);