Convierta la fecha y hora JS a la fecha y hora MySQL


124

¿Alguien sabe cómo convertir JS dateTime a MySQL datetime? ¿También hay una manera de agregar un número específico de minutos a JS datetime y luego pasarlo a MySQL datetime?

Respuestas:


89

Si bien JS posee suficientes herramientas básicas para hacer esto, es bastante torpe.

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

¿Cómo se llama a una función como esta con una variable?
Catfish

1
@Catfish ¿Quieres decir con una fecha específica? Usas un Dateobjeto. new Date().toMysqlFormat()o new Date(2014,12,14).toMysqlFormat()o lo que sea.
kojiro

17
Esta respuesta tuvo su día mientras JavaScript era viejo y torpe. Si apunta a un navegador moderno, le recomiendo el toISOStringenfoque 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);

o incluso más corto:

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

Salida:

2012-06-22 05:40:06

Para casos de uso más avanzados, incluido el control de la zona horaria, considere usar http://momentjs.com/ :

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

Para una alternativa ligera a , considere https://github.com/taylorhakes/fecha

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

Tiene un paréntesis de apertura adicional antes de date.getUTCDate, y sí, esto es mejor.
Adam Lockhart

28
esto dará problemas debido a la zona horaria
Mr Coder

3
Desecha la configuración de la zona horaria, ¿cómo mantenerla?
shapeare

2
combínalo con esto para cuidar la zona horaria: stackoverflow.com/questions/11887934/…
chiliNUT

3
Solución completa con timezone oneliner !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa

78

Creo que la solución puede ser menos complicada mediante el uso del método toISOString(), tiene una amplia compatibilidad con el navegador.

Entonces su expresión será de una sola línea:

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

La salida generada:

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


2
Funciona brillantemente! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
John

66
Grande, sólo una cuestión aquí: los métodos más torpe va a obtener la hora, día, mes (incluso años) después de la aplicación de los js Date's de desplazamiento de zona horaria . Mientras que el suyo devuelve la hora UTC subyacente en formato MySQL DATETIME. En la mayoría de los casos, el almacenamiento del UTC puede ser mejor, y en cualquier caso, su tabla de datos probablemente debería proporcionar información de ubicación en un campo. Alternativamente, convertir a la hora local es bastante fácil: usar ... - Date.getTimezoneOffset() * 60 * 1000(NB también se ajusta para el horario de verano, cuando corresponda).
Mike roedor

14

Valor de tiempo JS para MySQL

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

O

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

O

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

puedes enviar esto en params, funcionará.


11

Para una cadena de fecha arbitraria,

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

O una solución de una sola línea,

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

Esta solución también funciona para Node.js cuando se usa Timestamp en mysql.

La primera respuesta de @Gajus Kuizinas parece modificar el prototipo toISOString de mozilla


4

La venerable biblioteca DateJS tiene una rutina de formateo (anula ".toString ()"). También puedes hacer uno tú mismo con bastante facilidad porque los métodos de "Fecha" te dan todos los números que necesitas.


4

Solución alternativa completa (para mantener la zona horaria) usando el concepto de respuesta @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

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

100% trabajando


0

He dado ejemplos simples de formato de fecha de JavaScript, por favor verifique el siguiente código

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

Usando momentjs

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

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

Ejemplo, consulte https://jsfiddle.net/sjy3vjwm/2/


Acabo de probar su primer código con vanilla javascript y me da este resultado: 2018-4-20 15:11:23. No está rellenando los números con un "0" inicial. Además, no sé acerca de momentjs, pero ¿no tienes que poner "HH" durante una hora para que lo rellene? Tal vez es por eso que te votaron? (itwasntme)
Alex

0

La forma correcta más fácil de convertir JS Date al formato de fecha y hora de SQL que se me ocurre es esta. Maneja correctamente el desplazamiento de la zona horaria.

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

Tenga en cuenta que la respuesta de @Paulo Roberto producirá resultados incorrectos en el turno del nuevo día (no puedo dejar comentarios). Por ejemplo :

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 

¡Tenemos 22 de junio en lugar de 23!


0
var _t = new Date();

si quieres el formato UTC simplemente

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

o

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

y si quieres en una zona horaria específica, entonces

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

0

Estoy usando este largo tiempo y es muy útil para mí, úsalo como quieras

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

y luego solo:

new Date().date()

que devuelve la fecha actual en 'formato MySQL'

para agregar tiempo es

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

que agregará 30 minutos ... y así sucesivamente

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.