IT TIP

날짜 생성자는 IE에서 NaN을 반환하지만 Firefox 및 Chrome에서 작동합니다.

itqueen 2020. 10. 13. 20:00
반응형

날짜 생성자는 IE에서 NaN을 반환하지만 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실제로 'm, d, Y'형식으로 PHP로 설정되어있는 이번주의 월요일입니다 "02, 01, 2010".


Date 생성자는 모든 값을 허용합니다. 인수의 기본 [[값]]이 숫자이면 생성 된 날짜가 해당 값을 갖습니다. 기본 [[value]]가 String 인 경우 사양은 Date 생성자와 구문 분석 메서드가 Date.prototype.toString 및 Date.prototype.toUTCString ()의 결과를 구문 분석 할 수 있음 만 보장합니다.

날짜를 설정하는 안정적인 방법은 날짜를 생성하고 setFullYearsetTime메서드를 사용하는 것 입니다.

그 예는 다음과 같습니다. http://jibbering.com/faq/#parseDate

ECMA-262 r3은 날짜 형식을 정의하지 않습니다. 문자열 값을 Date 생성자 또는 Date.parse에 전달하면 구현에 따라 결과가 달라집니다. 피하는 것이 가장 좋습니다.


편집 : comp.lang.javascript FAQ의 항목은 다음과 같습니다. 확장 ISO 8601 로컬 날짜 형식 YYYY-MM-DDDate다음과 같이 구문 분석 할 수 있습니다 .

/**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;
  }

mysql datetime / timestamp 형식에서 :

var dateStr="2011-08-03 09:15:11"; //returned from mysql timestamp/datetime field
var a=dateStr.split(" ");
var d=a[0].split("-");
var t=a[1].split(":");
var date = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]);

누군가에게 유용하기를 바랍니다. IE FF Chrome에서 작동


입력 날짜 문자열을 현지 시간으로 사용하므로 "new Date ()"를 사용하지 마십시오.

new Date('11/08/2010').getTime()-new Date('11/07/2010').getTime();  //90000000
new Date('11/07/2010').getTime()-new Date('11/06/2010').getTime();  //86400000

"NewDate ()"를 사용해야합니다. 입력을 GMT 시간으로 사용합니다.

function NewDate(str)
         {str=str.split('-');
          var date=new Date();
          date.setUTCFullYear(str[0], str[1]-1, str[2]);
          date.setUTCHours(0, 0, 0, 0);
          return date;
         }
NewDate('2010-11-07').toGMTString();
NewDate('2010-11-08').toGMTString();

다음은 Date객체에 메서드를 추가하는 또 다른 접근 방식입니다.

용법: var d = (new Date()).parseISO8601("1971-12-15");

    / **
     * ISO 8601 형식의 날짜를 날짜 개체로 구문 분석합니다. ISO 8601은 YYYY-MM-DD입니다.
     * 
     * @param {String} 날짜를 문자열로 날짜 (예 : 1971-12-15)
     * @returns {Date} 제공된 문자열의 날짜를 나타내는 Date 객체
     * /
    Date.prototype.parseISO8601 = 함수 (날짜) {
        var match = date.match (/ ^ \ s * (\ d {4})-(\ d {2})-(\ d {2}) \ s * $ /);

        if (일치) {
            this.setFullYear (parseInt (matches [1]));    
            this.setMonth (parseInt (matches [2])-1);    
            this.setDate (parseInt (matches [3]));    
        }

        이것을 반환하십시오;
    };

나는 항상 UTC 시간으로 날짜를 저장합니다.

이 페이지에서 찾은 여러 기능으로 만든 내 기능입니다.

mysql DATETIME 형식으로 STRING을 사용합니다 (예 : 2013-06-15 15:21:41). 정규식으로 확인하는 것은 선택 사항입니다. 성능 향상을 위해이 부분을 삭제할 수 있습니다.

이 함수는 타임 스탬프를 반환합니다.

DATETIME은 UTC 날짜로 간주됩니다 . 주의 : 로컬 날짜 시간을 예상하는 경우이 기능은 적합하지 않습니다.

    function datetimeToTimestamp(datetime)
    {
        var regDatetime = /^[0-9]{4}-(?:[0]?[0-9]{1}|10|11|12)-(?:[012]?[0-9]{1}|30|31)(?: (?:[01]?[0-9]{1}|20|21|22|23)(?::[0-5]?[0-9]{1})?(?::[0-5]?[0-9]{1})?)?$/;
        if(regDatetime.test(datetime) === false)
            throw("Wrong format for the param. `Y-m-d H:i:s` expected.");

        var a=datetime.split(" ");
        var d=a[0].split("-");
        var t=a[1].split(":");

        var date = new Date();
        date.setUTCFullYear(d[0],(d[1]-1),d[2]);
        date.setUTCHours(t[0],t[1],t[2], 0);

        return date.getTime();
    }

다음은 IE의 동작을 수정하는 코드 스 니펫입니다 (v [ 'date']는 쉼표로 구분 된 날짜 문자열입니다 (예 : "2010,4,1")).

if($.browser.msie){
    $.lst = v['date'].split(',');
    $.tmp = new Date(parseInt($.lst[0]),parseInt($.lst[1])-1,parseInt($.lst[2]));
} else {
    $.tmp = new Date(v['date']);
}

이전 접근 방식에서는 JS Date 월이 ZERO 기반이라고 생각하지 않았습니다.

너무 많이 설명하지 않아서 죄송합니다. 저는 일하고 있는데 이것이 도움이 될 것이라고 생각했습니다.


내 접근 방식은 다음과 같습니다.

var parseDate = function(dateArg) {
    var dateValues = dateArg.split('-');
    var date = new Date(dateValues[0],dateValues[1],dateValues[2]);
    return date.format("m/d/Y");
}

사용중인 구분 기호로 대체하십시오 ('-').


아래 방법으로 날짜 텍스트를 보낼 날짜 텍스트와 형식을 보냅니다. 구문 분석하고 날짜로 반환하며 이것은 브라우저와 무관합니다.

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);
}

JavaScript의 Date 생성자에는 parse () 메서드에서 지원하는 날짜 형식 중 하나의 문자열이 필요합니다.

Apparently, the format you are specifying isn't supported in IE, so you'll need to either change the PHP code, or parse the string manually in JavaScript.


You can use the following code to parse ISO8601 date string:

function parseISO8601(d) {
    var timestamp = d;
    if (typeof (d) !== 'number') {
        timestamp = Date.parse(d);
    }
    return new Date(timestamp);
};

Try out using getDate feature of datepicker.

$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate")));

참고URL : https://stackoverflow.com/questions/2182246/date-constructor-returns-nan-in-ie-but-works-in-firefox-and-chrome

반응형