Converter JS date time para MySQL datetime

124

Alguém sabe como converter JS dateTime para MySQL datetime? Também existe uma maneira de adicionar um número específico de minutos ao JS datetime e depois passá-lo ao MySQL datetime?

locoboy
fonte

Respostas:

89

Embora o JS possua ferramentas básicas suficientes para fazer isso, é bastante desajeitado.

/**
 * 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
fonte
Como você chama uma função como essa com uma variável?
Catfish
1
@ Catfish Você quer dizer com uma data específica? Você usa um Dateobjeto. new Date().toMysqlFormat()ou new Date(2014,12,14).toMysqlFormat()ou o que quer.
Kojiro # 12/13
17
Essa resposta teve seu dia enquanto o JavaScript era antigo e desajeitado. Se você segmentar um navegador moderno, recomendo a toISOStringabordagem do 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 ainda mais curto:

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

Resultado:

2012-06-22 05:40:06

Para casos de uso mais avançados, incluindo o controle do fuso horário, considere usar http://momentjs.com/ :

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

Para uma alternativa leve a , considere https://github.com/taylorhakes/fecha

require('fecha').format('YYYY-MM-DD HH:mm:ss')
Gajus
fonte
Você tem um parêntese de abertura extra antes de date.getUTCDate e, sim, isso é melhor.
9138 Adam Lockhart
28
isso vai dar problema devido ao fuso horário
Sr. Coder
3
Joga fora a configuração de fuso horário, como mantê-la?
shapeare
2
combar-lo com este cuidar de fuso horário: stackoverflow.com/questions/11887934/...
chiliNUT
3
Solução completa com o fuso horário oneliner !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa
78

Eu acho que a solução pode ser menos complicada usando o método toISOString(), tem uma ampla compatibilidade com o navegador.

Portanto, sua expressão será única:

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

A saída gerada:

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

Farside
fonte
2
Funciona brilhantemente! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
John
6
Grande, apenas uma questão aqui: os métodos mais desajeitados estará recebendo a hora, dia, mês (mesmo ano) após aplicação dos js Date's diferença de fuso horário . Enquanto o seu retorna o horário UTC subjacente no formato MySQL DATETIME. Na maioria dos casos, o armazenamento do UTC pode ser melhor e, em ambos os casos, sua tabela de dados provavelmente deve fornecer informações de localização em um campo. Como alternativa, converter para a hora local é bastante fácil: use ... - Date.getTimezoneOffset() * 60 * 1000(NB também ajusta o horário de verão, quando aplicável).
mike roedor
14

Valor de tempo JS para 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' );

você pode enviar isso em parâmetros, isso funcionará.

M. Hamza Rajput
fonte
11

Para uma sequência de datas arbitrárias,

// 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 uma solução de linha única,

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

Essa solução também funciona para o Node.js ao usar o carimbo de data / hora no mysql.

A primeira resposta de @Gajus Kuizinas parece modificar o protótipo toISOString do mozilla

Paul Totzke
fonte
4

A venerável biblioteca DateJS possui uma rotina de formatação (substitui ".toString ()"). Você também pode fazer um facilmente, porque os métodos "Data" fornecem todos os números necessários.

Pontudo
fonte
4

Solução completa (para manter o fuso horário) usando o conceito de resposta @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
fonte
4

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

100% trabalhando

Nirbhay Kumar
fonte
0

Dei exemplos simples de formato de data JavaScript, verifique o código abaixo

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

Exemplo, verifique https://jsfiddle.net/sjy3vjwm/2/

Raja Rama Mohan Thavalam
fonte
Eu apenas tentei seu primeiro código com vanilla javascript e isso me dá o resultado: 2018-4-20 15:11:23. Você não está preenchendo os números com um "0" inicial. Além disso, eu não sei sobre momentjs, mas você não precisa colocar "HH" por uma hora para que isso aconteça? Talvez seja por isso que você foi votado? (itwasntme)
Alex
0

A maneira correta mais fácil de converter o JS Date para o formato de data e hora SQL que me ocorre é esse. Ele lida corretamente com o deslocamento do fuso horário.

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

Cuidado que a resposta do @Paulo Roberto produzirá resultados incorretos no turn do novo dia (não posso deixar comentários). Por exemplo :

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 

Temos 22 de junho em vez de 23!

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

se você quer o formato UTC simplesmente

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

ou

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

e se quiser em fuso horário específico, então

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

Estou usando esse longo tempo e é muito útil para mim, use como quiser

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

e então apenas:

new Date().date()

que retorna a data atual no 'formato MySQL'

para adicionar tempo é

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

que adicionará 30 minutos .... e assim por diante

Thomas
fonte