Konvertieren Sie den MySql DateTime-Stempel in das Datumsformat von JavaScript

160

Weiß jemand, wie ich einen MySQL- datetimeDatentypwert nehmen YYYY-MM-DD HH:MM:SSund ihn entweder analysieren oder konvertieren kann, um in der JavaScript- Date()Funktion zu funktionieren, zum Beispiel: - Datum ('JJJJ, MM, TT, HH, MM, SS);

Danke dir!

dzm
quelle
Dann, nachdem ich das alles getan habe, finde ich, dass Javascript-Daten keine einfache Möglichkeit haben, Daten hinzuzufügen ...
Kolob Canyon

Antworten:

418

Einige der hier gegebenen Antworten sind entweder zu kompliziert oder funktionieren einfach nicht (zumindest nicht in allen Browsern). Wenn Sie einen Schritt zurücktreten, können Sie sehen, dass der MySQL-Zeitstempel jede Zeitkomponente in derselben Reihenfolge wie die vom Date()Konstruktor benötigten Argumente enthält .

Alles, was benötigt wird, ist eine sehr einfache Aufteilung der Zeichenfolge:

// Split timestamp into [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);

// Apply each element to the Date function
var d = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));

console.log(d);
// -> Wed Jun 09 2010 14:12:01 GMT+0100 (BST)

Faire Warnung: Dies setzt voraus, dass Ihr MySQL-Server UTC-Daten ausgibt (dies ist die Standardeinstellung und wird empfohlen, wenn die Zeichenfolge keine Zeitzonenkomponente enthält).

Andy E.
quelle
3
Vielen Dank für diese elegante Lösung! Ich musste es verwenden, weil Safari anscheinend nicht in der Lage ist, ein Datumsobjekt automatisch aus einer MySQL-Zeitstempelzeichenfolge zu generieren, z. var d = new Date("2010-06-09 13:12:01");. Interessanterweise hat Chrome damit kein Problem.
Alnafie
und zu denken, dass andere Antworten eine komplexere Lösung vorschlagen. Vielen Dank!
RD
Das ist die falsche Antwort. Die richtige Antwort wird unten von Symen Timmermans gepostet. Alle Daten werden als Zahl serialisiert (gespeichert), die seit 1970 UTC entweder Sekunden (im Fall eines Unix-Zeitstempels) oder Millisekunden (Javascript) zählt. Das Manipulieren von Datumszeichenfolgen, bei denen es sich um verschlungene Darstellungen dieser Zahl handelt, ist eine Verschwendung von Ressourcen. Übergeben Sie einfach den Unix-Zeitstempel (multipliziert mit 1000 für Millisekunden) an den Javascript-Datumskonstruktor (wie von Symen Timmermans vorgeschlagen) und Sie haben ihn.
Reinsbrain
1
@Reinsbrain: Es ist nicht die falsche Antwort, nur eine, die nicht Ihren Anforderungen entspricht. Es besteht ein Unterschied. Was ist, wenn der Implementierer keinen Zugriff auf den Servercode hat, der die MySQL-Abfrage ausführt (möglicherweise eine Art Webdienst)? Was ist, wenn es einfacher ist, den clientseitigen Code zu bearbeiten, da das Ändern auf dem Server mehr Arbeit bedeuten würde? Es macht keinen Sinn, Haare über ein paar Bytes aufzuteilen, die durch Zippen unbedeutend werden könnten, oder die Zehntausendstel Millisekunden, die zum Teilen einer Zeichenfolge erforderlich sind.
Andy E
4
uh mysql verwendet eine Zeitzone und der Javascript Date-Konstruktor akzeptiert nur die lokale Zeitzone, wodurch diese Lösung um bis zu 24 Stunden falsch ist ... das new Date(Date.UTC(...))ist besser, aber das setzt voraus, dass mysql utc verwendet ... so oder so muss es sein zuvor betrachtet kann dies als richtige Antwort angesehen werden.
user3338098
64

Um die ausgezeichnete Antwort von Andy E zu ergänzen, könnte eine Funktion der allgemeinen Verwendung sein:

Date.createFromMysql = function(mysql_string)
{ 
   var t, result = null;

   if( typeof mysql_string === 'string' )
   {
      t = mysql_string.split(/[- :]/);

      //when t[3], t[4] and t[5] are missing they defaults to zero
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }

   return result;   
}

Auf diese Weise können Sie bei einem MySQL-Datum / einer MySQL-Uhrzeit im Formular "YYYY-MM-DD HH:MM:SS"oder sogar in der Kurzform (nur Datum) "YYYY-MM-DD"Folgendes tun:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
Marco Demaio
quelle
3
Sie sollten new Date(Date.UTC(...))andere Weise verwenden, die Antwort ist bis zu 24 Stunden falsch ...
user3338098
30

Ich glaube, ich habe einen einfacheren Weg gefunden, den niemand erwähnt hat.

Eine MySQL DATETIME-Spalte kann durch Folgendes in einen Unix-Zeitstempel konvertiert werden:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Wir können ein neues JavaScript-Datumsobjekt erstellen, indem wir den Konstruktor verwenden, der seit der Epoche Millisekunden benötigt. Die Funktion unix_timestamp gibt Sekunden seit der Epoche zurück, daher müssen wir mit 1000 multiplizieren:

SELECT unix_timestamp(my_datetime_column) * 1000 as stamp ...

Der resultierende Wert kann direkt verwendet werden, um ein korrektes Javascript-Datumsobjekt zu instanziieren:

var myDate = new Date(<?=$row['stamp']?>);

Hoffe das hilft.

Symen Timmermans
quelle
4
Ja, der effiziente und einfache Weg. Aber ich würde die Multiplikation (* 1000) des Unix-Zeitstempels auf den Client (in Javascript) übertragen
Reinsbrain
16

Ein Liner für moderne Browser (IE10 +):

var d = new Date(Date.parse("2010-06-09 13:12:01"));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

Und nur zum Spaß, hier ist ein Einzeiler, der in älteren Browsern funktioniert (jetzt behoben):

new (Function.prototype.bind.apply(Date, [null].concat("2010-06-09 13:12:01".split(/[\s:-]/)).map(function(v,i){return i==2?--v:v}) ));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)
Aleemb
quelle
1
Das zweite Beispiel ("Einzeiler, der in älteren Browsern funktioniert") gibt mir ein Datum für einen Monat in der Zukunft. Ich denke, der Monatsparameter ist nullindiziert.
Nickyspag
@nickyspag Mist! Es wurde mit map () behoben, aber nicht mehr so ​​prägnant.
Aleemb
AUSGEZEICHNETE Antwort .. sie alle haben funktioniert, besonders die erste
David Addoteye
7

In neueren Versionen von JavaScript wird ein ISO8601-formatiertes Datum gelesen. Sie müssen also nur den Leerzeichen in ein 'T' ändern und Folgendes tun:

#MySQL
select date_format(my_date_column,'%Y-%m-%dT%T') from my_table;

#PHP
$php_date_str = substr($mysql_date_str,0,10).'T'.substr($mysql_date_str,11,8);

//JavaScript
js_date_str = mysql_date_str.substr(0,10)+'T'+mysql_date_str.substr(11,8);
Jeff
quelle
3

Um die Lösung von Marco noch weiter zu verbessern. Ich habe einen Prototyp direkt für das String-Objekt erstellt.

String.prototype.mysqlToDate = String.prototype.mysqlToDate || function() {
    var t = this.split(/[- :]/);
    return new Date(t[0], t[1]-1, t[2], t[3]||0, t[4]||0, t[5]||0);
};

Auf diese Weise können Sie direkt zu:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();
Adrian Bartholomäus
quelle
3

Es gibt einen einfacheren Weg, SQL-Zeitstempel-String:

2018-07-19 00:00:00

Das Format, das dem Zeitstempel für Date () am nächsten kommt, ist das folgende. Ersetzen Sie daher das Leerzeichen für "T":

var dateString = media.intervention.replace(/\s/g, "T");

2011-10-10T14: 48: 00

Erstellen Sie dann das Datumsobjekt:

var date = new Date(dateString);

Ergebnis wäre das Datumsobjekt:

Do 19. Juli 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)

Caique Matos
quelle
2

Aus Andys Antwort für AngularJS - Filter

angular
    .module('utils', [])
.filter('mysqlToJS', function () {
            return function (mysqlStr) {
                var t, result = null;

                if (typeof mysqlStr === 'string') {
                    t = mysqlStr.split(/[- :]/);

                    //when t[3], t[4] and t[5] are missing they defaults to zero
                    result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);
                }

                return result;
            };
        });
Jaym
quelle
Hallo und danke an jaym. Dies löste ein fehlerhaftes Datum in einer eckigen App, die ich für ios erstellt hatte.
Mediaguru
1
var a=dateString.split(" ");
var b=a[0].split("-");
var c=a[1].split(":");
var date = new Date(b[0],(b[1]-1),b[2],b[0],c[1],c[2]);
bhowden
quelle
+1 für das Nichtaufrufen regulärer Ausdrücke. (Nun, wenn wir es einfach in einen Oneliner verwandeln und die Vars loswerden könnten ...)
T4NK3R
1

Zuerst können Sie dem Date-Objekt (der Klasse) von JavaScript die neue Methode 'fromYMD ()' zum Konvertieren des YMD-Datumsformats von MySQL in das JavaScript-Format geben, indem Sie das YMD-Format in Komponenten aufteilen und diese Datumskomponenten verwenden:

Date.prototype.fromYMD=function(ymd)
{
  var t=ymd.split(/[- :]/); //split into components
  return new Date(t[0],t[1]-1,t[2],t[3]||0,t[4]||0,t[5]||0);
};

Jetzt können Sie Ihr eigenes Objekt definieren (Funktion in der JavaScript-Welt):

function DateFromYMD(ymd)
{
  return (new Date()).fromYMD(ymd);
}

und jetzt können Sie einfach ein Datum aus dem MySQL-Datumsformat erstellen.

var d=new DateFromYMD('2016-07-24');
sbrbot
quelle
0

Sie können den Unix-Zeitstempel verwenden, um Folgendes zu steuern:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Holen Sie sich dann die epoch_time in JavaScript, und es ist eine einfache Sache von:

var myDate = new Date(epoch_time * 1000);

Das Multiplizieren mit 1000 ist darauf zurückzuführen, dass JavaScript Millisekunden dauert und UNIX_TIMESTAMP Sekunden angibt.

Bharat
quelle
-3

Eine schnelle Suche in Google lieferte Folgendes:

 function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
  }

Quelle: http://snippets.dzone.com/posts/show/4132

Stefan Valianu
quelle
-4

Warum nicht:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
quelle
2
parseDate ist keine JS-Methode des Date-Objekts. Schließlich gibt es eine statische Analysemethode, die jedoch nur 1 Argument akzeptiert.
Marco Demaio