selfmade01: datetime momentjs invalid date

hallo,

ich möchte mit moment.js mein mysql Datetime formatieren was in der Form von

2015-02-19 12:12:00 vom Server kommt.
Mit der moment Funktion
var cellvalue ="2015-02-19 12:12:00";
var datetime = moment(cellvalue).format("DD-MM-YYYY HH:mm");

lasse ich es mir anzeigen.

das funktioniert wunderbar.
ich erhalte das folgende Format

19-02-2015 12:12

Da ich ein jqgrid plugin verwende was meine Tabelle und alle Formulare erzeugt, benutze ich in den datetime Feldern den Bootstrap datetimepicker.

Dieser funktioniert auch im deutschen Format.

Wenn nun jedoch das Datum und die Uhrzeit zurück in das Textfeld geschrieben wird, wird nochmals durch das plugin die Funktion mit der moment-Funktion aufgerufen

ich erhalte hier dann bereits das zuvor sauber umgewandelte Datum in der Form 19-02-2015 12:12

das passt dann jedoch der moment Funktion
datetime = moment(cellvalue).format("DD-MM-YYYY HH:mm");
 nicht mehr und sie bringt ein
Invalid Date

weiss jemand warum?

Grüße Jürgen

  1. Hi,

    ich erhalte hier dann bereits das zuvor sauber umgewandelte Datum in der Form 19-02-2015 12:12

    das passt dann jedoch der moment Funktion
    datetime = moment(cellvalue).format("DD-MM-YYYY HH:mm");
    nicht mehr und sie bringt ein
    Invalid Date

    weiss jemand warum?

    Weil das schlicht und einfach kein valides Datum nach ISO 8601 ist, was moment.js aber erwartet.

    Wenn du es mit einem anderen Format füttern willst, musst du dieses explizit beschreiben.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
  2. Hakuna matata!

    das passt dann jedoch der moment Funktion
    datetime = moment(cellvalue).format("DD-MM-YYYY HH:mm");
    nicht mehr und sie bringt ein
    Invalid Date

    weiss jemand warum?

    Sieh doch in der Dokumentation nach.

    moment(cellvalue, 'DD-MM-YYYY HH:mm') sollte dir ein gültiges Datumsobjekt liefern.

    Aber wieso willst du das Datum erst parsen, um es dann in genau dem selben Format wieder auszugeben?

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Hallo,

      aus der Doku wurde ich nicht ganz schlau, da ich dachte er erhält ein valides Datum.
      Aber anscheinend ist ein Datum in der Form yyyy-mm-dd hh:mm:ss nur valide

      Aber wieso willst du das Datum erst parsen, um es dann in genau dem selben Format wieder auszugeben?

      eben nicht bzw. will ich es nur für den deutschen User im deutschen Format ausgeben. in die DB wird es jedoch im mysql datetime Format abgespeichert.

      Das Problem ist die jqgrid-Tabelle diese gibt mir bestimmte Möglichkeiten um Zellen zu formatieren und wenn ich ein Formular aufrufe also die Felder editiere dass dann ein bestimmte andere Funktion aufgerufen wird.
      Da ich hier jedoch für den User im Textfeld dann ein umformatiertes Datum stehen habe kommt wohl moment.js nicht damit klar.

      in diesem Moment bräuchte ich moment.js gar nicht mehr da ich es ja schon für mich richtig formatiert habe.
      Leider wird diese Funktion aber doch aufgerufen da dies intern von jqgrid gesteuert wird.

      Es sieht so aus

        
      { name: 'lastTimeClean', width: 150 , editable: true ,sorttype:"date",  
      											formatter:function (cellvalue, options, rowObject)//Formatter formatiert mein mysqldatum für die deutsche Ausgabe 											{																return changeMysqlDateTimeFormat(cellvalue, options, rowObject, '<?php echo  $_SESSION['lang']; ?>');  
      },  
      											unformat: pickDate }, //Pickdate hier wird mein Bootsrap datetimepicker aufgerufen falls es editiert wird  
      
      

      hier die Function changeMysqlDateTimeFormat

        
      				function changeMysqlDateTimeFormat(cellvalue, options, rowObject,lang)  
      				{	  
      						if (lang =="DE"){  
      						moment.locale("de");  
      						return datetime = moment(cellvalue).format("DD-MM-YYYY HH:mm");  
      						}else{  
      						return datetime = moment(cellvalue).format("YYYY-MM-DD hh:mm");  
      						}	  
      				}  
      
      

      hier die pickdate

        
        
      				function pickDate( cellvalue, options, cell ) {  
      					setTimeout(function(lang){  
      						var lang = '<?php echo  $_SESSION['lang']; ?>';  
      								if(lang == "DE"){  
      									$(cell) .find('input[type=text]').datetimepicker({ format:'DD-MM-YYYY HH:mm', 	autoclose:true,language: 'de', use24hours: true});  
      								}else{  
      									$(cell) .find('input[type=text]').datetimepicker({ format:'YYYY-MM-DD hh:mm', 	autoclose:true,language: 'en', use24hours: true});  
      								}								  
      					}, 200);  
      				}  
      
      

      Ich muss also irgendwie das Format anpassen.
      da es um die selbe function geht  changeMysqlDateTimeFormat in der ich mit moment.js formatiere und diese einmal das korrekte mysql datetime format bekommt und einmal mein bereits geändertes muss ich mir an dieser Stell was einfallen lassen.

      Entweder ich schaffe es über moment.js zu lösen oder muss unter jqgrid mir eine andere option suchen dies meine changeMysqlDateTimeFormat Function nur einmal aufruft

      Grüße

      Jürgen

    2. Hallo

      moment(cellvalue, 'DD-MM-YYYY HH:mm') sollte dir ein gültiges Datumsobjekt liefern.

      Dieser Vorschlag geht leider gar nicht.

      Da stehen nur noch Zahlen im Textfeld

      mhhh?

      Grüße Jürgen

      1. Hakuna matata!

        moment(cellvalue, 'DD-MM-YYYY HH:mm') sollte dir ein gültiges Datumsobjekt liefern.

        Dieser Vorschlag geht leider gar nicht.

        Ich habe dir keine fertige Lösung präsentiert, sondern dir nur einen Zwischenschritt verraten.

        Dein Progromma muss folgende Aufgabe bewältigen:

        1. Aus einem Datumsstring muss ein moment-Objekt erzeugt werden. Dazu ist die Factory-Funktion moment() da. In dem zweiten Parameter kannst du optional das Format angeben.

        2. Aus einem moment-Objekt muss ein neuer Datumsstring in deinem gewünschten Format erfolgen. Dafür gibt es die Methode .format().

        Ich traue dir zu, dass du die Bauklötze selber aufeinandersetzen kannst.

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Ich habe dir keine fertige Lösung präsentiert, sondern dir nur einen Zwischenschritt verraten.

          Hallo,

          Danke für die Hilfestellung.
          Jetzt weiss ich etwas mehr und ich hoffe es hinzubekommen.

          Was mich jedoch sehr stark irritierte ist

          var validDate = moment(cellvalue, "DD-MM-YYYY HH:mm").isValid();

          gibt mit stets ein "true" zurück.

          Im ersten Fall wenn das Datum frisch aus der mysql-db kommt leuchtet mir das noch ein.

          da mir hier jedoch verraten wurde das ich keinen ISO-Standard verwende und somit mein Datum gar nicht valide ist, wundert mich schon das Ergebnis aus .isValid();

          Aber ich werde mir jetzt nochmals die Doku ansehen und mit Deinen Tipps hoffe ich das es klappt

          Grüße Jürgen

        2. Hallo,

          das mit dem Objekt erzeugen und wie ich das Format hin bekomme habe ich mittlerweile.

          Ich glaube ich habe aber das Problem etwas falsch beschrieben.

          Die Funktion in der moment aufgerufen wird, wird von meiner jqgrid function zweimal aufgerufen.
          Beim ersten mal funktioniert es noch da ich ja das Datumsformat kenne und es entsprechend umwandeln kann.

          Das Problem ist, ich weiss in der jqgrid function nicht ob es nun der erste Aufruf oder der zweite Aufruf ist.

          Da ich beim ersten Aufruf das Datumsformat auf ein deutsches Format gesetzt habe und dann die Funktion ein zweitesmal aufgerufen wird, bekommt moment urplötzlich ein deutsches Format mit dem es wohl nicht zurecht kommt.

          ich müsste zuerst moment dazu bewegen abzufragen um welches Format es sich handelt um es dann entsprechend umwandeln zu können damit mir kein invalid Date kommt.

          Habe ich da jetzt was total missverstanden?

          Grüße Jürgen

        3. Hallo

          habe es nun mit einer Abfrage geschafft
          var check = moment(cellvalue, 'DD-MM-YYYY HH:mm', true).isValid(); // false

          so erfahre ich ob das Datum bereits umgewandelt wurde, also als Deutsches Datum aus der Celle kommt oder als gültiges ISO-Format aus der DB.
          bei meinem ersten isValid() fehlte der Wert true

          Ob das so nun der richtige Weg war/ist ... keine Ahnung
          zumindest geht es jetzt

          Grüße Jürgen