it-swarm.com.de

Der Datumskonstruktor gibt NaN in IE zurück, funktioniert aber in Firefox und Chrome

Ich versuche einen kleinen Kalender in JavaScript zu erstellen. Ich habe meine Daten in Firefox und Chrome hervorragend, aber in IE geben die Datumsfunktionen NaN zurück. 

Hier ist die Funktion:

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 ist der Montag der aktuellen Woche, der tatsächlich in php im Format "m, d, Y" eingestellt ist, z. "02, 01, 2010".

73
pedalpete

Der Date-Konstruktor akzeptiert jeden Wert. Wenn das Grundelement [[Wert]] des Arguments number ist, hat das Datum, das erstellt wird, diesen Wert. Wenn primitiv [[value]] String ist, garantiert die Spezifikation nur, dass der Date-Konstruktor und die parse-Methode das Ergebnis von Date.prototype.toString und Date.prototype.toUTCString () parsen können.

Eine zuverlässige Methode zum Festlegen eines Datums besteht darin, ein Datum zu erstellen und die Methoden setFullYear und setTime zu verwenden.

Ein Beispiel dafür erscheint hier: http://jibbering.com/faq/#parseDate

ECMA-262 r3 definiert keine Datumsformate. Die Übergabe von Zeichenfolgenwerten an den Date-Konstruktor oder Date.parse hat ein implementierungsabhängiges Ergebnis. Es wird am besten vermieden.


Edit: Der Eintrag von comp.lang.javascript FAQ lautet: Ein lokales Datumsformat des erweiterten ISO 8601-Codes YYYY-MM-DD kann in eine Date-Datei mit den folgenden Parametern analysiert werden:

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

Von einem Mysql-Datum/Zeitstempelformat:

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

Ich hoffe, es ist nützlich für jemanden . Funktioniert in IE FF Chrome

84
Qlimax

Verwenden Sie nicht "new Date ()", da die Eingabedatenzeichenfolge als Ortszeit verwendet wird:

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

wir sollten "NewDate ()" verwenden, es dauert die Eingabe als GMT-Zeit:

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();
15
diyism

Hier ist ein weiterer Ansatz, der dem Date-Objekt eine Methode hinzufügt

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

 /**
 * Analysiert das nach ISO 8601 formatierte Datum in ein Datumsobjekt. ISO 8601 ist JJJJ-MM-TT 
 * 
 * @param {String} Datum das Datum als String, zB 1971-12-15 
 * @returns {Date} Date-Objekt, das das Datum der angegebenen Zeichenfolge darstellt 
 */
 Date.prototype.parseISO8601 = Funktion (Datum) {
 var passt = date.match (/ ^\s * (\ d {4}) - (\ d {2}) - (\ d {2})\s * $ /); 

 if (passt zu) {
 this.setFullYear (parseInt (match [1])); 
 this.setMonth (parseInt (entspricht [2]) - 1); 
 this.setDate (parseInt (match [3])); 
 } 

 zurückgeben; 
 }; 
7
magikMaker

Ich speichere mein Datum immer in UTC-Zeit.

Dies ist meine eigene Funktion aus den verschiedenen Funktionen, die ich auf dieser Seite gefunden habe.

Es erfordert einen STRING als mysql-DATETIME-Format (Beispiel: 2013-06-15 15:21:41). Die Überprüfung mit dem Regex ist optional. Sie können diesen Teil löschen, um die Leistung zu verbessern.

Diese Funktion liefert einen Zeitstempel.

Das DATETIME wird als UTC-Datum betrachtet . Achtung: Wenn Sie eine lokale Datumszeit erwarten, ist diese Funktion nicht für Sie.

    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
Gabriel

Hier ist ein Codeausschnitt, der das Verhalten von IE Behebt. (V ['date'] ist eine durch Kommas getrennte Datumszeichenfolge, z. B. "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']);
}

Der vorherige Ansatz hat nicht berücksichtigt, dass der JS-Datum-Monat NULL-basiert ist ...

Tut mir leid, dass ich nicht zu viel erkläre. Ich bin bei der Arbeit und dachte nur, das könnte helfen.

2
Martin Zeitler

Hier ist mein Ansatz:

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

ersetzen Sie ('-') durch das verwendete Trennzeichen.

1
xin

Senden Sie den Datumstext und das Format, in dem Sie den Datentext senden, in der unten angegebenen Methode. Es wird als Datum analysiert und zurückgegeben, und dies ist vom Browser unabhängig.

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
valli

Sie können den folgenden Code verwenden, um die Datumszeichenfolge von ISO8601 zu analysieren:

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

Der Date-Konstruktor in JavaScript benötigt eine Zeichenfolge in einem der Datumsformate, die von der parse () -Methode unterstützt werden.

Offenbar wird das von Ihnen angegebene Format nicht im IE unterstützt. Sie müssen also entweder den Code PHP ändern oder die Zeichenfolge manuell in JavaScript analysieren.

0
richardtallent

Versuchen Sie es mit der getDate-Funktion von datepicker.

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