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


79

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".


2
당신은 당신의 코드 샘플에 문에 대한의 모양을 일부 복사 - 붙여 넣기 오류가 : for(var d=0;d';그 인상됩니다 SyntaxError...
기독교 C. Salvadó

답변:


67

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

고마워 개렛. 링크에서 제공 한 기능은 내가 찾은 다른 것보다 훨씬 더 간결하며 앱의 다른 99 %에서 사용하는 날짜 형식으로 작동합니다! 내가 사용했던 것보다 훨씬 더 일관성이 있습니다.
pedalpete 2010

많은 구조화 된 형식이 W3C 날짜 / 시간 형식 (전체 사양의 ISO-8601 정도)을 사용하기 때문에 이것은 좋지 않습니다. 따라서 타임 스탬프는 여러면에서 더 좋을 수 있지만 (더 간단하고 효율적이며 모든 브라우저에서 작동) 표준 날짜 / 시간 데이터가 자바 스크립트의 파서 인 경우가 많습니다. jQuery 등이 더 나은 구문 분석 방법을 가지고 있는지 궁금합니다.
StaxMan

3
IE7은 NAN 말을하는 동안 크롬 잘 분석 날짜를 왜 작동하는지, 지적 미쳐가는 주셔서 감사합니다, JQuery와에서 좋은 일이 $ .datepicker.parseDate는 구문 분석 날짜에 수
카를로스 제이미 C. 드 레온

밀리 초도 원한다면?
okysabeni 2013 년

문자열에서 ISO 날짜 / 시간을 구문 분석하기 위해이 코드에서 파생 된 함수를 사용하고 있습니다. 드물게 나는 if (month != date.getMonth() + 1)진술에 유효 해 보이는 값을 입력 하여 날짜를 무효화합니다. 예 : 2014-06-01T01:09:22.68. 이 if진술 의 목적을 설명 할 수 있습니까 ?
Grinn 2014-06-05

87

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에서 작동


모든 브라우저에서 작동합니다. Thnx
Tejas

1
const a = dateStr.split(' '); const d = a[0].split('-'); const t = a[1].split(':'); currentValue.created_date = new Date(+d[0], (+d[1] - 1), +d[2], +t[0], +t[1]);ES5 이상.
Sydwell

15

입력 날짜 문자열을 현지 시간으로 사용하므로 "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();

7

다음은 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]));    
        }

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

2

나는 항상 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();
    }

2

다음은 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 기반이라고 생각하지 않았습니다.

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


1

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

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

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


1

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

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

고마워 Valli. 그가 링크 한 기능이 더 작고 정기적으로 사용하는 날짜 형식으로 작업했기 때문에 아래 Garrett의 대답을 사용했습니다.
pedalpete 2010

0

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

분명히 지정하는 형식은 IE에서 지원되지 않으므로 PHP 코드를 변경하거나 JavaScript에서 문자열을 수동으로 구문 분석해야합니다.


4
그 정도는 분명하지만 지원되는 형식이 무엇인지 아는 것이 좋습니다 ...
StaxMan

0

다음 코드를 사용하여 ISO8601 날짜 문자열을 구문 분석 할 수 있습니다.

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

0

getDate기능을 사용해보십시오 datepicker.

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

0

위의 모든 솔루션을 시도했지만 아무것도 효과가 없었습니다. 나는 약간의 브레인 스토밍을했고 이것을 발견했고 IE11에서도 잘 작동했습니다.

value="2020-08-10 05:22:44.0";
var date=new Date(value.replace(" ","T")).$format("d/m/yy h:i:s");
console.log(date);

$ format이 작동하지 않으면 format 만 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.