Konvertieren Sie die JS-Datums- und Uhrzeit in MySQL-Datums- und Uhrzeitangaben

124

Weiß jemand, wie man JS dateTime in MySQL datetime konvertiert? Gibt es auch eine Möglichkeit, JS datetime eine bestimmte Anzahl von Minuten hinzuzufügen und diese dann an MySQL datetime zu übergeben?

locoboy
quelle

Antworten:

88

JS verfügt zwar über genügend grundlegende Tools, ist jedoch ziemlich klobig.

/**
 * You first need to create a formatting function to pad numbers to two digits…
 **/
function twoDigits(d) {
    if(0 <= d && d < 10) return "0" + d.toString();
    if(-10 < d && d < 0) return "-0" + (-1*d).toString();
    return d.toString();
}

/**
 * …and then create the method to output the date string as desired.
 * Some people hate using prototypes this way, but if you are going
 * to apply this to more than one Date object, having it as a prototype
 * makes sense.
 **/
Date.prototype.toMysqlFormat = function() {
    return this.getUTCFullYear() + "-" + twoDigits(1 + this.getUTCMonth()) + "-" + twoDigits(this.getUTCDate()) + " " + twoDigits(this.getUTCHours()) + ":" + twoDigits(this.getUTCMinutes()) + ":" + twoDigits(this.getUTCSeconds());
};
Kojiro
quelle
Wie ruft man eine solche Funktion mit einer Variablen auf?
Wels
1
@Catfish Du meinst mit einem bestimmten Datum? Sie verwenden ein DateObjekt. new Date().toMysqlFormat()oder new Date(2014,12,14).toMysqlFormat()oder was auch immer.
Kojiro
17
Diese Antwort hatte ihren Tag, als JavaScript alt und klobig war. Wenn Sie auf einen modernen Browser abzielentoISOString , empfehle ich den Ansatz von Gajus .
Kojiro
320
var date;
date = new Date();
date = date.getUTCFullYear() + '-' +
    ('00' + (date.getUTCMonth()+1)).slice(-2) + '-' +
    ('00' + date.getUTCDate()).slice(-2) + ' ' + 
    ('00' + date.getUTCHours()).slice(-2) + ':' + 
    ('00' + date.getUTCMinutes()).slice(-2) + ':' + 
    ('00' + date.getUTCSeconds()).slice(-2);
console.log(date);

oder noch kürzer:

new Date().toISOString().slice(0, 19).replace('T', ' ');

Ausgabe:

2012-06-22 05:40:06

Für fortgeschrittenere Anwendungsfälle, einschließlich der Steuerung der Zeitzone, sollten Sie http://momentjs.com/ verwenden :

require('moment')().format('YYYY-MM-DD HH:mm:ss');

Für eine leichte Alternative zu Betrachten Sie https://github.com/taylorhakes/fecha

require('fecha').format('YYYY-MM-DD HH:mm:ss')
Gajus
quelle
Sie haben eine zusätzliche öffnende Klammer vor date.getUTCDate, und ja, das ist besser.
Adam Lockhart
28
Dies wird aufgrund der Zeitzone zu Problemen führen
Mr Coder
3
Es wirft die Zeitzoneneinstellung weg, wie man es behält?
Shapeare
2
Kombiniere es damit, um dich
chiliNUT
3
Vollständige Problemumgehung mit Timezone Oneliner !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa
78

Ich denke, die Lösung kann mit der Methode weniger klobig sein toISOString(), sie hat eine breite Browserkompatibilität.

Ihr Ausdruck wird also ein Einzeiler sein:

new Date().toISOString().slice(0, 19).replace('T', ' ');

Die generierte Ausgabe:

"2017-06-29 17:54:04"

Farside
quelle
2
Funktioniert hervorragend! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
John
6
Große, nur eine Frage hier: Je mehr klobig Methoden die Stunde werden immer, Tag, Monat (auch Jahr) nach Anwendung der js Date‚s Zeitzone versetzt . Während Ihre die zugrunde liegende UTC-Zeit im MySQL DATETIME-Format zurückgibt. In den meisten Fällen ist das Speichern der UTC möglicherweise besser, und in beiden Fällen sollte Ihre Datentabelle wahrscheinlich Standortinformationen in einem Feld enthalten. Alternativ ist die Umrechnung in die Ortszeit recht einfach: Verwenden Sie diese ... - Date.getTimezoneOffset() * 60 * 1000Option (NB passt gegebenenfalls auch die Sommerzeit an).
Mike Nagetier
14

JS-Zeitwert für MySQL

var datetime = new Date().toLocaleString();

ODER

const DATE_FORMATER = require( 'dateformat' );
var datetime = DATE_FORMATER( new Date(), "yyyy-mm-dd HH:MM:ss" );

ODER

const MOMENT= require( 'moment' );
let datetime = MOMENT().format( 'YYYY-MM-DD  HH:mm:ss.000' );

Sie können dies in params senden, es wird funktionieren.

M. Hamza Rajput
quelle
11

Für eine beliebige Datumszeichenfolge

// Your default date object  
var starttime = new Date();
// Get the iso time (GMT 0 == UTC 0)
var isotime = new Date((new Date(starttime)).toISOString() );
// getTime() is the unix time value, in milliseconds.
// getTimezoneOffset() is UTC time and local time in minutes.
// 60000 = 60*1000 converts getTimezoneOffset() from minutes to milliseconds. 
var fixedtime = new Date(isotime.getTime()-(starttime.getTimezoneOffset()*60000));
// toISOString() is always 24 characters long: YYYY-MM-DDTHH:mm:ss.sssZ.
// .slice(0, 19) removes the last 5 chars, ".sssZ",which is (UTC offset).
// .replace('T', ' ') removes the pad between the date and time.
var formatedMysqlString = fixedtime.toISOString().slice(0, 19).replace('T', ' ');
console.log( formatedMysqlString );

Oder eine einzeilige Lösung,

var formatedMysqlString = (new Date ((new Date((new Date(new Date())).toISOString() )).getTime() - ((new Date()).getTimezoneOffset()*60000))).toISOString().slice(0, 19).replace('T', ' ');
console.log( formatedMysqlString );

Diese Lösung funktioniert auch für Node.js, wenn Timestamp in MySQL verwendet wird.

@ Gajus Kuizinas 'erste Antwort scheint Mozillas toISOString-Prototyp zu modifizieren

Paul Totzke
quelle
4

Die ehrwürdige DateJS- Bibliothek verfügt über eine Formatierungsroutine (sie überschreibt ".toString ()"). Sie können es auch ganz einfach selbst machen, da die "Date" -Methoden Ihnen alle Zahlen geben, die Sie benötigen.

Spitze
quelle
4

Vollständige Problemumgehung (um die Zeitzone zu erhalten) mit dem @ Gajus-Antwortkonzept:

var d = new Date(),
    finalDate = d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
console.log(finalDate); //2018-09-28 16:19:34 --example output
Paulo Roberto Rosa
quelle
4

neues Datum (). toISOString (). Slice (0, 10) + "" + neues Datum (). toLocaleTimeString ('en-GB');

100% arbeiten

Nirbhay Kumar
quelle
0

Ich habe einfache Beispiele für das JavaScript-Datumsformat angegeben. Bitte überprüfen Sie den folgenden Code

var data = new Date($.now()); // without jquery remove this $.now()
console.log(data)// Thu Jun 23 2016 15:48:24 GMT+0530 (IST)

var d = new Date,
    dformat = [d.getFullYear() ,d.getMonth()+1,
               d.getDate()
               ].join('-')+' '+
              [d.getHours(),
               d.getMinutes(),
               d.getSeconds()].join(':');

console.log(dformat) //2016-6-23 15:54:16

Verwenden von momentjs

var date = moment().format('YYYY-MM-DD H:mm:ss');

console.log(date) // 2016-06-23 15:59:08

Beispiel überprüfen Sie bitte https://jsfiddle.net/sjy3vjwm/2/

Raja Rama Mohan Thavalam
quelle
Ich habe gerade Ihren ersten Code mit Vanille-Javascript ausprobiert und es gibt mir dieses Ergebnis: 2018-4-20 15:11:23. Sie füllen die Zahlen nicht mit einer führenden "0" auf. Ich weiß auch nichts über momentjs, aber musst du nicht stundenlang "HH" setzen, damit es aufgefüllt wird? Vielleicht bist du deshalb runtergestimmt worden? (itwasntme)
Alex
0

Der einfachste richtige Weg, um JS Date in das SQL datetime-Format zu konvertieren, das mir einfällt, ist dieser. Der Zeitzonenversatz wird korrekt behandelt.

const toSqlDatetime = (inputDate) => {
    const date = new Date(inputDate)
    const dateWithOffest = new Date(date.getTime() - (date.getTimezoneOffset() * 60000))
    return dateWithOffest
        .toISOString()
        .slice(0, 19)
        .replace('T', ' ')
}

toSqlDatetime(new Date()) // 2019-08-07 11:58:57
toSqlDatetime(new Date('2016-6-23 1:54:16')) // 2016-06-23 01:54:16

Beachten Sie, dass die Antwort von @Paulo Roberto am neuen Tag zu falschen Ergebnissen führt (ich kann keine Kommentare hinterlassen). Zum Beispiel :

var d = new Date('2016-6-23 1:54:16'),
    finalDate = d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
console.log(finalDate); // 2016-06-22 01:54:16 

Wir haben den 22. Juni statt den 23. Juni!

Vlad Harbarchuk
quelle
0
var _t = new Date();

Wenn Sie einfach das UTC-Format wünschen

_t.toLocaleString('indian', { timeZone: 'UTC' }).replace(/(\w+)\/(\w+)\/(\w+), (\w+)/, '$3-$2-$1 $4');

oder

_t.toISOString().slice(0, 19).replace('T', ' ');

und wenn in einer bestimmten Zeitzone dann wollen

_t.toLocaleString('indian', { timeZone: 'asia/kolkata' }).replace(/(\w+)\/(\w+)\/(\w+), (\w+)/, '$3-$2-$1 $4');
Suraj Inamdar
quelle
0

Ich benutze diese lange Zeit und es ist sehr hilfreich für mich, verwenden Sie, wie Sie möchten

Date.prototype.date=function() {
    return this.getFullYear()+'-'+String(this.getMonth()+1).padStart(2, '0')+'-'+String(this.getDate()).padStart(2, '0')
}

Date.prototype.time=function() {
    return String(this.getHours()).padStart(2, '0')+':'+String(this.getMinutes()).padStart(2, '0')+':'+String(this.getSeconds()).padStart(2, '0')
}

Date.prototype.dateTime=function() {
    return this.getFullYear()+'-'+String(this.getMonth()+1).padStart(2, '0')+'-'+String(this.getDate()).padStart(2, '0')+' '+String(this.getHours()).padStart(2, '0')+':'+String(this.getMinutes()).padStart(2, '0')+':'+String(this.getSeconds()).padStart(2, '0')
}

Date.prototype.addTime=function(time) {
    var time=time.split(":")
    var rd=new Date(this.setHours(this.getHours()+parseInt(time[0])))
    rd=new Date(rd.setMinutes(rd.getMinutes()+parseInt(time[1])))
    return new Date(rd.setSeconds(rd.getSeconds()+parseInt(time[2])))
}

Date.prototype.addDate=function(time) {
    var time=time.split("-")
    var rd=new Date(this.setFullYear(this.getFullYear()+parseInt(time[0])))
    rd=new Date(rd.setMonth(rd.getMonth()+parseInt(time[1])))
    return new Date(rd.setDate(rd.getDate()+parseInt(time[2])))
}

Date.prototype.subDate=function(time) {
    var time=time.split("-")
    var rd=new Date(this.setFullYear(this.getFullYear()-parseInt(time[0])))
    rd=new Date(rd.setMonth(rd.getMonth()-parseInt(time[1])))
    return new Date(rd.setDate(rd.getDate()-parseInt(time[2])))
}

und dann einfach:

new Date().date()

Dies gibt das aktuelle Datum im 'MySQL-Format' zurück.

für zusätzliche Zeit ist

new Date().addTime('0:30:0')

das wird 30 Minuten hinzufügen .... und so weiter

Thomas
quelle