новый Date () работает в Chrome, но не Firefox - PullRequest
82 голосов
/ 15 июля 2010

Я создаю строку даты и времени, которая выглядит следующим образом: 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 ]

76 голосов
/ 15 июля 2010

Вы не можете создать экземпляр объекта даты так, как хотите. Это должно быть определенным образом. Вот несколько действительных примеров:

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

Из апсиллеров Комментарий:

спецификации EMCAScript требуется ровно один формат даты (т. Е. ГГГГ-ММ-ДДТЧ: мм: сс.сссZ), но пользовательские форматы даты могут свободно поддерживаться реализацией : « Если строка не соответствует этому [определенному ECMAScript] формату, функция может прибегнуть к любым зависящим от реализации эвристическим или специфическим для реализации форматам даты. « Chrome и FF просто имеют разные »специфичные для реализации форматы даты. "

21 голосов
/ 13 марта 2013

Это работает во всех браузерах -

новая дата ('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

11 голосов
/ 04 октября 2013

Это работает и в большинстве браузеров

new Date('2001/01/31 12:00:00')

Это формат

"yyyy/MM/dd HH:mm:ss"
10 голосов
/ 26 февраля 2016

Вариант 1:

Предположим, что ваша временная строка имеет формат, который выглядит следующим образом:

'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

Вариант 2:

Предположим, что ваша временная строка имеет следующий формат:

'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
8 голосов
/ 31 августа 2013

Если вы все еще хотите создать дату, используя тире, вы можете использовать этот формат:

var date = new Date('2013-08-31T17:00:00Z')

Но имейте в виду, что это создает время в соответствии с UTC. Это означает, что если вы живете в часовом поясе GMT ​​+ 3 (на 3 часа раньше времени по Гринвичу), это смещение часового пояса будет добавлено к времени. Таким образом, приведенный выше пример будет иметь это значение, если GMT + 3 (обратите внимание, что это час 20:00, а не 17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Обязательно добавьте букву «Z» в конце, потому что в противном случае Chrome и Firefox будут анализировать строку по-разному (один добавит смещение по времени, а другой - нет).

5 голосов
/ 24 апреля 2014

У меня была похожая проблема в 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')

Если вы хотите включить этодобавив дополнительную библиотеку в свое приложение, вы сможете с легкостью создать строку даты, избегая при этом возможных проблем с совместимостью браузера.В качестве бонуса у вас будет хороший способ легко форматировать, добавлять, вычитать и т. Д. Даты, если это необходимо.

4 голосов
/ 20 июля 2013

Это должно работать для вас:

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));
1 голос
/ 17 января 2018

Простое решение, работает со всеми браузерами,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
1 голос
/ 24 ноября 2014

Одна ситуация, с которой я столкнулся, была при работе с миллисекундами. FF и IE не будут правильно анализировать эту строку даты при попытке создать новую дату. "2014/11/24 17:38:20.177Z" Они не знают, как обращаться с .177Z. Chrome будет работать, хотя.

0 голосов
/ 18 июля 2015

Я использовал следующий формат даты, и он работает во всех браузерах.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...