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?

locoboy
fuente

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());
};
kojiro
fuente
¿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')
Gajus
fuente
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"

Lado lejano
fuente
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á.

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

Paul Totzke
fuente
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.

Puntiagudo
fuente
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
Paulo Roberto Rosa
fuente
4

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

100% trabajando

Nirbhay Kumar
fuente
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/

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

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

Thomas
fuente