Javascript Date (dateString) возвращает NaN на определенном сервере и в браузере

#javascript #internet-explorer #iis #date

#javascript #internet-explorer #iis #Дата

Вопрос:

Я использую конструктор Javascript Date (string) с форматом даты «гггг-мм-дд». Конструктор отлично работает в IE 9 и Firefox, если только приложение не запущено на нашей тестируемой виртуальной машине, на которой запущен IIS. Если он установлен на виртуальной машине, в IE 9 он возвращает ‘NaN’, но в Firefox все еще работает нормально.

     var dateAsString = "2011-11-09";
    var dateCreated = new Date(dateAsString);
  

Я предполагал, что сервер не имеет ничего общего с Javascript на стороне клиента. Есть предложения?

Комментарии:

1. Довольно уверен, что сервер не имеет ничего общего с клиентским Javascript, поскольку клиент (человек, посещающий сайт) запускает этот код, а не сервер.

2. @jakx Я знаю, вот почему меня это смущает.

3. Проверьте режим документа в инструментах разработчика IE (F12) на обоих серверах. Я подозреваю, что они отличаются.

4. @Phrogz побеждает! Спасибо. Теперь я могу спать сегодня ночью!

Ответ №1:

И для тех из нас, кто хочет знать, как заменить дефисы (они же тире) косыми чертами:

 new Date(dashToSlash(string));
  

Который использует эту функцию:

 function dashToSlash(string){
  var response = string.replace(/-/g,"/");
  //The slash-g bit says: do this more than once
  return response;
}
  

В моем случае гораздо проще выборочно преобразовать дефисы в косую черту (только там, где это необходимо для функции Date ()), чем заменять формат даты везде в моем коде.

Примечание: вам действительно нужно определить отдельную переменную ‘response’ и присвоить ей значение результата операции замены. Если вы этого не сделаете, строка возвращается неизмененной в Chrome. Это не огромная проблема, поскольку у Chrome изначально нет проблем со строками даты, переносимыми через дефис. Но все же…

Комментарии:

1. you really need to define a separate 'response' variable and assign it the value of the replace operation result. If you don't, the string is returned unaltered in Chrome. что?

Ответ №2:

Просто используйте косые черты вместо дефисов, если можете.


РЕДАКТИРОВАТЬ: Расширенное разъяснение…

Стандартный формат ISO 8601 использует дефис в качестве разделителя дат. Мой ответ не означает, что вам не нужно следовать стандартам. При необходимости вы можете использовать косые черты только для конструктора Date.

Комментарии:

1. Это, безусловно, звучит привлекательно. Можете ли вы подтвердить, что все другие основные браузеры также поддерживают формат, разделенный косой чертой?

2. Работает просто великолепно! 🙂

Ответ №3:

Это из-за формата даты. По какой-то причине IE и Safari запускаются с yyyy-mm-dd . Используйте другой формат даты, и все должно быть готово.

Об этом говорилось здесь:
http://biostall.com/javascript-new-date-returning-nan-in-ie-or-invalid-date-in-safari

Комментарии:

1. Но реальная проблема в том, что это работает в IE, когда я запускаю приложение на своем локальном хостинге (Visual Studio server). Это не работает в IE, когда он находится на другом сервере.

2. Установлена ли на другом сервере другая версия IE?

3. Нет, в одном IE 9 открываются две разные вкладки. Тот же JS-код, другое поведение.

4. @Gagege: Используете ли вы localhost или у вас есть более реалистичное доменное имя, например, dev.example.com . IE может действовать по-разному в зависимости от зоны, с которой он связывает сайт (Доверенный / Интрасеть / Интернет / Ненадежный / Мой компьютер).

5. @LeeKowalkowski Это имело бы смысл, но оказывается, что «режим документа» в IE9 был установлен на IE7 для одного из серверов.

Ответ №4:

Я предлагаю попробовать более надежную форму анализа даты. В приведенном ниже примере используется setFullYear() . Выдает ли IE другой результат с помощью приведенного ниже кода?

 /**Parses string formatted as YYYY-MM-DD to a Date object.
   * If the supplied string does not match the format, an 
   * invalid Date (value NaN) is returned.
   * @param {string} dateStringInRange format YYYY-MM-DD, with year in
   * range of 0000-9999, inclusive.
   * @return {Date} Date object representing the string.
   */
  function parseISO8601(dateStringInRange) {
    var isoExp = /^s*(d{4})-(dd)-(dd)s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) {
      month =  parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth()   1) {
        date.setTime(NaN);
      }
    }
    return date;
  }
  

Источник: http://jibbering.com/faq/#parseDate

Комментарии:

1. Это сработало. Это все еще сбивает меня с толку. Сервер, обслуживающий JS, не должен иметь значения, верно? Мой код работал в IE, когда я запускал его на localhost.

2. У меня была дата, которая также включала время и пояс (нужна была только дата). Я отредактировал ваше регулярное выражение в строке 2 и удалил из него оба ^ и $. В остальном все работало как по маслу.