#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 и удалил из него оба ^ и $. В остальном все работало как по маслу.