Convertir la date et l'heure JS en date / heure MySQL


124

Quelqu'un sait-il comment convertir JS dateTime en datetime MySQL? Existe-t-il également un moyen d'ajouter un nombre spécifique de minutes à datetime JS, puis de le transmettre à datetime MySQL?

Réponses:


89

Bien que JS possède suffisamment d'outils de base pour ce faire, c'est assez maladroit.

/**
 * 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());
};

Comment appeler une fonction comme celle-ci avec une variable?
Catfish

1
@Catfish Vous voulez dire avec une date précise? Vous utilisez un Dateobjet. new Date().toMysqlFormat()ou new Date(2014,12,14).toMysqlFormat()quoi que ce soit.
kojiro

17
Cette réponse a fait son temps alors que JavaScript était vieux et maladroit. Si vous ciblez un navigateur moderne, je recommande l' toISOStringapproche de 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);

ou même plus court:

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

Production:

2012-06-22 05:40:06

Pour des cas d'utilisation plus avancés, y compris le contrôle du fuseau horaire, envisagez d'utiliser http://momentjs.com/ :

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

Pour une alternative légère à , considérez https://github.com/taylorhakes/fecha

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

Vous avez une parenthèse ouvrante supplémentaire avant date.getUTCDate, et oui c'est mieux.
Adam Lockhart

28
cela posera un problème en raison du fuseau horaire
Mr Coder

3
Il jette le réglage du fuseau horaire, comment le garder?
shapeare

2
combo-le avec ceci pour prendre soin du fuseau horaire: stackoverflow.com/questions/11887934/…
chiliNUT

3
Solution de contournement complète avec un seul fuseau horaire !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa

78

Je pense que la solution peut être moins maladroite en utilisant la méthode toISOString(), elle a une large compatibilité avec les navigateurs.

Donc, votre expression sera un one-liner:

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

La sortie générée:

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


2
Fonctionne à merveille! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
John

6
Grande, une seule question ici: les méthodes plus maladroites vont recevoir l'heure, le jour, le mois (même année) après application des js Datel » fuseau horaire décalé . Alors que le vôtre renvoie l'heure UTC sous-jacente au format MySQL DATETIME. Dans la plupart des cas, le stockage de l'UTC peut être mieux, et dans les deux cas, votre table de données devrait probablement donner des informations de localisation dans un champ. Alternativement, la conversion à l'heure locale est assez simple: utilisez ... - Date.getTimezoneOffset() * 60 * 1000(NB ajuste également l'heure d'été le cas échéant).
mike rodent

14

Valeur de temps JS pour MySQL

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

OU

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

OU

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

vous pouvez envoyer ceci dans les paramètres, cela fonctionnera.


11

Pour une chaîne de date arbitraire,

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

Ou une solution mono-ligne,

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

Cette solution fonctionne également pour Node.js lors de l'utilisation de Timestamp dans mysql.

La première réponse de @Gajus Kuizinas semble modifier le prototype toISOString de Mozilla


4

La vénérable bibliothèque DateJS a une routine de formatage (elle remplace ".toString ()"). Vous pouvez également en faire un vous-même assez facilement car les méthodes "Date" vous donnent tous les chiffres dont vous avez besoin.


4

Solution de contournement complète (pour conserver le fuseau horaire) en utilisant le concept de réponse @Gajus:

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

4

new Date (). toISOString (). slice (0, 10) + "" + new Date (). toLocaleTimeString ('en-GB');

100% de travail


0

J'ai donné des exemples simples de format de date JavaScript, veuillez vérifier le code ci-dessous

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

Utilisation de momentjs

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

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

Exemple s'il vous plaît vérifier https://jsfiddle.net/sjy3vjwm/2/


Je viens d'essayer votre premier code avec javascript vanille et cela me donne ce résultat: 2018-4-20 15:11:23. Vous ne remplissez pas les nombres avec un "0" non significatif. De plus, je ne sais pas à propos de momentjs mais tu n'as pas besoin de mettre "HH" pendant une heure pour qu'il le rembourre? C'est peut-être pour ça que vous avez voté? (itwasntme)
Alex

0

Le moyen le plus simple de convertir la date JS au format datetime SQL qui me vient à l'esprit est celui-ci. Il gère correctement le décalage du fuseau horaire.

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

Attention, la réponse de @Paulo Roberto produira des résultats incorrects au tournant du nouveau jour (je ne peux pas laisser de commentaires). Par exemple :

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 

Nous avons le 22 juin au lieu du 23!


0
var _t = new Date();

si vous voulez simplement le format UTC

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

ou

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

et si vous le souhaitez dans un fuseau horaire spécifique, alors

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

0

J'utilise ce temps et c'est très utile pour moi, utilisez comme vous le souhaitez

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

et puis juste:

new Date().date()

qui renvoie la date actuelle au 'format MySQL'

car ajouter du temps est

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

ce qui ajoutera 30 minutes ... et ainsi de suite

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.