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?

Locoboy
la source

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());
};
Kojiro
la source
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')
Gajus
la source
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"

Autre côté
la source
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.

M. Hamza Rajput
la source
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

Paul Totzke
la source
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.

Pointu
la source
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
Paulo Roberto Rosa
la source
4

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

100% de travail

Nirbhay Kumar
la source
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/

Raja Rama Mohan Thavalam
la source
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!

Vlad Harbarchuk
la source
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');
Suraj Inamdar
la source
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

Thomas
la source