Конструктор Date возвращает NaN в IE, но работает в Firefox и Chrome

Я пытаюсь создать немного календаря в JavaScript. У меня есть свои даты, работающие отлично в Firefox и Chrome, но в IE функции даты возвращают NaN.

Вот функция:

function buildWeek(dateText){
    var headerDates='';
    var newDate = new Date(dateText);

    for(var d=0;d<7;d++){
        headerDates += '<th>' + newDate + '</th>';
        newDate.setDate(newDate.getDate()+1);
    }                       

    jQuery('div#headerDates').html('<table><tr>'+headerDates+'</tr></table>');
}

dateText понедельник текущей недели, которая на самом деле установлена в php в формате 'm, d, Y', например. "02, 01, 2010".

78
задан JJJ 17 October 2015 в 18:45
поделиться

3 ответа

Конструктор Date принимает любое значение. Если примитив [[значение]] аргумента - число, то созданная дата имеет это значение. Если примитив [[value]] равен String, тогда спецификация гарантирует только то, что конструктор Date и метод синтаксического анализа способны анализировать результат Date.prototype.toString и Date.prototype.toUTCString ()

Надежный способ set a Date означает его создание и использование методов setFullYear и setTime .

Пример этого появляется здесь: http://jibbering.com/faq/#parseDate

ECMA-262 r3 не определяет никаких форматов даты. Передача строковых значений конструктору Date или Date.parse имеет результат, зависящий от реализации. Лучше избегать.


Изменить: Запись в FAQ по comp.lang.javascript: Расширенный локальный формат даты ISO 8601 YYYY-MM-DD может быть преобразован в Date с помощью следующих : -
/**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})-(\d\d)-(\d\d)\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;
  }
66
ответ дан 24 November 2019 в 10:31
поделиться

Конструктор даты в JavaScript нуждается в строке в одном из форматов даты, поддерживаемых методом Parse ().

, по-видимому, формат, который вы определяете, не поддерживается в IE, поэтому вам нужно либо изменить код PHP или разбирать строку вручную в JavaScript.

0
ответ дан 24 November 2019 в 10:31
поделиться

Отправьте текст даты и формат, в котором вы отправляете текст даты, описанным ниже способом. Он будет анализировать и возвращать дату, и это не зависит от браузера.

function cal_parse_internal(val, format) {
val = val + "";
format = format + "";
var i_val = 0;
var i_format = 0;
var x, y;
var now = new Date(dbSysCurrentDate);
var year = now.getYear();
var month = now.getMonth() + 1;
var date = now.getDate();

while (i_format < format.length) {
    // Get next token from format string
    var c = format.charAt(i_format);
    var token = "";
    while ((format.charAt(i_format) == c) && (i_format < format.length)) {
        token += format.charAt(i_format++);
    }
    // Extract contents of value based on format token
    if (token == "yyyy" || token == "yy" || token == "y") {
        if (token == "yyyy") { x = 4; y = 4; }
        if (token == "yy")   { x = 2; y = 2; }
        if (token == "y")    { x = 2; y = 4; }
        year = _getInt(val, i_val, x, y);
        if (year == null) { return 0; }
        i_val += year.length;
        if (year.length == 2) {
            if (year > 70) {
                year = 1900 + (year - 0);
            } else {
                year = 2000 + (year - 0);
            }
        }
    } else if (token == "MMMM") {
        month = 0;
        for (var i = 0; i < MONTHS_LONG.length; i++) {
            var month_name = MONTHS_LONG[i];
            if (val.substring(i_val, i_val + month_name.length) == month_name) {
                month = i + 1;
                i_val += month_name.length;
                break;
            }
        }
        if (month < 1 || month > 12) { return 0; }
    } else if (token == "MMM") {
        month = 0;
        for (var i = 0; i < MONTHS_SHORT.length; i++) {
            var month_name = MONTHS_SHORT[i];
            if (val.substring(i_val, i_val + month_name.length) == month_name) {
                month = i + 1;
                i_val += month_name.length;
                break;
            }
        }
        if (month < 1 || month > 12) { return 0; }
    } else if (token == "MM" || token == "M") {     
        month = _getInt(val, i_val, token.length, 2);
        if (month == null || month < 1 || month > 12) { return 0; }
        i_val += month.length;
    } else if (token == "dd" || token == "d") {
        date = _getInt(val, i_val, token.length, 2);
        if (date == null || date < 1 || date > 31) { return 0; }
        i_val += date.length;
    } else {
        if (val.substring(i_val, i_val+token.length) != token) {return 0;}
        else {i_val += token.length;}
    }
}

// If there are any trailing characters left in the value, it doesn't match
if (i_val != val.length) { return 0; }

// Is date valid for month?
if (month == 2) {
    // Check for leap year
    if ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) { // leap year
        if (date > 29) { return false; }
    } else {
        if (date > 28) { return false; }
    }
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
    if (date > 30) { return false; }
}
return new Date(year, month - 1, date);
}
1
ответ дан 24 November 2019 в 10:31
поделиться
Другие вопросы по тегам:

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