Проверка даты JavaScript при использовании firefox [duplicate]

AngularJS работает с контекстом jsdom без каких-либо трюков. Просто добавьте angular.js в список js src и главную страницу углового приложения к jsdom по его инициализации.

Итак, рендеринг очень прост: используйте угловое значение в jsdom, и оно работает.

Один из способов - изменение пакетной синхронизации DOM.

Чтобы получать динамические обновления от сервера к клиенту, вы можете использовать MutationEvents (к сожалению, jsdom does't поддержка MutationObservers, но MutationEvents работают довольно быстро). Используйте их, чтобы складывать изменения DOM в массиве накопителей и периодически нажимать их на клиентский браузер (скажем, за 25 мс).

Также, чтобы включить пользовательские события, вы должны отслеживать их по документам в браузере и схожих накопителях и нажмите их на сервер.

Одной из реализаций такого подхода является jsdom-sync ( https://www.npmjs.org/package/jsdom-sync )

Недостатком рендеринга на стороне сервера является отсутствие размера модели окна DOM, поскольку для получения ширины / высоты элемента он должен быть фактически отображен. Это решение вряд ли подходит для svg и т. Д.

Также вы можете рассмотреть возможность просмотра модели области и синхронизацию ее с областями на стороне браузера, но это совершенно другая история.

71
задан John Slegers 15 April 2018 в 23:06
поделиться

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)

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

69
ответ дан Community 15 August 2018 в 18:48
поделиться

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

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

. Это формат

"yyyy/MM/dd HH:mm:ss"
10
ответ дан Alvis 15 August 2018 в 18:48
поделиться
  • 1
    Нет гарантии, что формат будет работать в любом браузере, и тем более «все». – RobG 6 April 2016 в 23:09
  • 2
    Вы правы в этом, ответ основан на моем опыте. – Alvis 7 April 2016 в 14:43

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

1
ответ дан bjo 15 August 2018 в 18:48
поделиться

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

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
0
ответ дан Chetan Chaudhari 15 August 2018 в 18:48
поделиться

На самом деле 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. проанализируйте в 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 всегда будет в любом браузере.

0
ответ дан Haimei 15 August 2018 в 18:48
поделиться

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

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);
-1
ответ дан James Z 15 August 2018 в 18:48
поделиться

В Firefox любая недопустимая дата возвращается как объект Date как Date 1899-11-29T19:00:00.000Z, поэтому проверьте, является ли браузер Firefox, а затем получает объект Date строки "1899-11-29T19:00:00.000Z".getDate(). Наконец сравните его с датой.

-1
ответ дан Jeeped 15 August 2018 в 18:48
поделиться
  • 1
    Это не объясняет причину проблемы, а скорее будет результатом проблемы. – Rytis 22 September 2014 в 16:38
  • 2
    Этот ответ просто ошибочен. – RobG 6 April 2016 в 23:12

Вариант 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

Вариант 2:

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

'02-24-2015 09:22:21 PM'

Здесь, вы можете сделать следующее regex:

'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

9
ответ дан John Slegers 15 August 2018 в 18:48
поделиться
  • 1
    var d = new Date ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Это отлично работает для меня в хроме, а также в мозилле. – Rahul Mankar 28 August 2017 в 14:33

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

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));
4
ответ дан Kevin Panko 15 August 2018 в 18:48
поделиться

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

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 будут анализировать строку по-разному (один добавит смещение по времени, а другой не будет).

8
ответ дан Shreedhar 15 August 2018 в 18:48
поделиться
  • 1
    Да, хром и firefox ведут себя по-другому, если вы не предоставляете часовой пояс. И, из интереса, я думаю, что firefox делает это неправильно. Он должен принять GMT, если часовой пояс отсутствует. Chrome делает, firefox - нет. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 – Julian Jelfs 8 May 2014 в 11:07
  • 2
    @ JulianJelfs- Он должен предположить GMT, если часовой пояс отсутствует ", только для даты (в отличие от ISO 8601). Для строк даты и времени он должен принимать локальные (в соответствии с ISO 8601). Но в любом случае ручная разборка является единственным безопасным способом. – RobG 6 April 2016 в 23:16

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

new Date ('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

19
ответ дан Tahin Rahman 15 August 2018 в 18:48
поделиться
  • 1
    потому что мы все знаем, что это международный стандарт. w3.org/International/questions/qa-date-format – Bobby Tables 17 June 2013 в 09:53
  • 2
    Итак, вы действительно протестировали все браузеры ? Предполагая, что вы знаете, что все браузеры в будущем также будут поддерживать этот (нестандартный) формат? – RobG 19 March 2014 в 07:15
  • 3
    Это работает для меня. Поэтому, если вы уже получили строку «2001-1-31 12:00:00», мы можем просто сделать: new Date (str.replace (/ - / g, '/')); – Jianwu Chen 10 May 2016 в 22:13
  • 4
    @JianwuChen Вы намеренно изменяете стандартный формат на нестандартный. Не хорошая идея. – JJJ 16 June 2016 в 09:13
  • 5
    Спустя три года он не работает над Edge и Window Safari. – Thet Hlaing 14 November 2016 в 08:22

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

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

5
ответ дан Zakaria Acharki 15 August 2018 в 18:48
поделиться
  • 1
    Вы должны всегда передавать формат moment.js при разборе строк, иначе он просто догадывается, пока не найдет тот, который создает действительную дату. – RobG 6 April 2016 в 23:14
Другие вопросы по тегам:

Похожие вопросы: