новая дата() работает в 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 его работа просто отлично, что было бы основной причиной?

674   12  

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

    Ничего не найдено.