Converter carimbo de data e hora do MySql no formato de data do JavaScript

160

Alguém sabe como posso obter um datetimevalor de tipo de dados MySQL , como YYYY-MM-DD HH:MM:SSe analisá-lo ou convertê-lo para funcionar na Date()função JavaScript , por exemplo: - Data ('AAAA, MM, DD, HH, MM, SS);

Obrigado!

dzm
fonte
Em seguida, depois de fazer tudo isso, acho que o Javascript datas não têm uma maneira fácil de adicionar datas ...
Kolob Canyon

Respostas:

418

Algumas das respostas fornecidas aqui são complicadas demais ou simplesmente não funcionarão (pelo menos, não em todos os navegadores). Se você der um passo atrás, poderá ver que o registro de data e hora do MySQL possui cada componente de tempo na mesma ordem que os argumentos exigidos peloDate() construtor.

Tudo o que é necessário é uma divisão muito simples na string:

// Split timestamp into [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);

// Apply each element to the Date function
var d = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));

console.log(d);
// -> Wed Jun 09 2010 14:12:01 GMT+0100 (BST)

Aviso justo: isso pressupõe que o servidor MySQL está exibindo datas UTC (que é o padrão e recomendado se não houver nenhum componente de fuso horário da string).

Andy E
fonte
3
Muito obrigado por esta solução elegante! Eu tive que usá-lo porque o Safari não parece capaz de gerar automaticamente um objeto Date a partir de uma string de carimbo de data / hora do MySQL, por exemplo. var d = new Date("2010-06-09 13:12:01");. O interessante é que o Chrome não tem nenhum problema.
alnafie
e pensar que outras respostas sugerem uma solução mais complexa. Muito obrigado!
RD
Esta é a resposta errada. A resposta correta é postada abaixo por Symen Timmermans. Todas as datas são serializadas (armazenadas) como um número que conta segundos (no caso de registro de data e hora unix) ou milissegundos (javascript) desde 1970 UTC. Manipular seqüências de datas que são representações complicadas desse número é um desperdício de recursos. Basta passar o carimbo do tempo unix (multiplicado por 1000 por milissegundos) para o construtor javascript Date (conforme sugerido por Symen Timmermans) e você o terá.
Reinsbrain
1
@ Reinsbrain: Não é a resposta errada, apenas uma que não atendeu às suas necessidades. Há uma diferença. E se o implementador não tiver acesso ao código do servidor executando a consulta MySQL (talvez algum tipo de serviço da web)? E se for mais fácil editar o código do lado do cliente, pois alterá-lo no servidor significaria mais trabalho? Não adianta dividir os cabelos em alguns bytes que podem ser considerados insignificantes com o gzip, ou os dez milésimos de milésimo de segundo necessários para dividir uma string.
Andy E
4
uh, o mysql usa um fuso horário e o construtor javascript Date só aceita o fuso horário local, tornando a solução errada em até 24 horas ... new Date(Date.UTC(...))é melhor, mas assume que o mysql usa utc ... de qualquer forma considerado antes que isso possa ser considerado uma resposta correta.
user3338098
64

Para adicionar à excelente resposta de Andy E, uma função de uso comum pode ser:

Date.createFromMysql = function(mysql_string)
{ 
   var t, result = null;

   if( typeof mysql_string === 'string' )
   {
      t = mysql_string.split(/[- :]/);

      //when t[3], t[4] and t[5] are missing they defaults to zero
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }

   return result;   
}

Dessa forma, dada uma data / hora do MySQL no formulário "YYYY-MM-DD HH:MM:SS"ou mesmo no formato abreviado (única data), "YYYY-MM-DD"você pode:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
Marco Demaio
fonte
3
você deve estar usando new Date(Date.UTC(...))outro sábio a resposta é errada por até 24 horas ...
user3338098
30

Acho que encontrei uma maneira mais simples, que ninguém mencionou.

Uma coluna MySQL DATETIME pode ser convertida em um timestamp unix através de:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Podemos criar um novo objeto Data JavaScript usando o construtor que requer milissegundos desde a época. A função unix_timestamp retorna segundos desde a época, portanto, precisamos multiplicar por 1000:

SELECT unix_timestamp(my_datetime_column) * 1000 as stamp ...

O valor resultante pode ser usado diretamente para instanciar um objeto Data Javascript correto:

var myDate = new Date(<?=$row['stamp']?>);

Espero que isto ajude.

Symen Timmermans
fonte
4
Sim, a maneira fácil e eficiente. Mas, eu iria empurrar a multiplicação (* 1000) do timestamp unix para o cliente (em javascript)
Reinsbrain
16

Um revestimento para navegadores modernos (IE10 +):

var d = new Date(Date.parse("2010-06-09 13:12:01"));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

E apenas por diversão, aqui está uma lista que funcionará em navegadores mais antigos (agora corrigidos):

new (Function.prototype.bind.apply(Date, [null].concat("2010-06-09 13:12:01".split(/[\s:-]/)).map(function(v,i){return i==2?--v:v}) ));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)
aleemb
fonte
1
O segundo exemplo ("one-liner que funcionará em navegadores mais antigos") fornece uma data para um mês no futuro. Eu acho que o parâmetro do mês é indexado a zero.
nickyspag
@nickyspag bummer! corrigido usando map (), mas não tão sucinto.
aleemb 30/07/2015
Excelente resposta .. todos eles fizeram trabalho, especialmente o primeiro
David Addoteye
7

As versões recentes do JavaScript lerão uma data no formato ISO8601; portanto, tudo o que você precisa fazer é alterar o espaço para um 'T', fazendo algo como um dos seguintes:

#MySQL
select date_format(my_date_column,'%Y-%m-%dT%T') from my_table;

#PHP
$php_date_str = substr($mysql_date_str,0,10).'T'.substr($mysql_date_str,11,8);

//JavaScript
js_date_str = mysql_date_str.substr(0,10)+'T'+mysql_date_str.substr(11,8);
Jeff
fonte
3

Para adicionar ainda mais à solução de Marco. Eu prototipei diretamente para o objeto String.

String.prototype.mysqlToDate = String.prototype.mysqlToDate || function() {
    var t = this.split(/[- :]/);
    return new Date(t[0], t[1]-1, t[2], t[3]||0, t[4]||0, t[5]||0);
};

Dessa forma, você pode ir diretamente para:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();
Adrian Bartholomew
fonte
3

Existe uma maneira mais simples, string de carimbo de data / hora sql:

2018-07-19 00:00:00

O formato mais próximo do carimbo de data e hora para Date () a receber é o seguinte, portanto, substitua o espaço em branco por "T":

var dateString = media.intervention.replace(/\s/g, "T");

"2011-10-10T14: 48: 00"

Em seguida, crie o objeto de data:

var date = new Date(dateString);

result seria o objeto date:

Qui 19 jul 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)

Caique Matos
fonte
2

Da resposta de Andy , para AngularJS - Filtro

angular
    .module('utils', [])
.filter('mysqlToJS', function () {
            return function (mysqlStr) {
                var t, result = null;

                if (typeof mysqlStr === 'string') {
                    t = mysqlStr.split(/[- :]/);

                    //when t[3], t[4] and t[5] are missing they defaults to zero
                    result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);
                }

                return result;
            };
        });
Jaym
fonte
Oi e obrigado a Jaym. Isso resolveu uma data interrompida em um aplicativo angular que eu criei para o ios.
Mediaguru
1
var a=dateString.split(" ");
var b=a[0].split("-");
var c=a[1].split(":");
var date = new Date(b[0],(b[1]-1),b[2],b[0],c[1],c[2]);
Bhowden
fonte
+1 por não evocar expressões regulares. (Agora, se pudéssemos transformá-lo em um oneliner e se livrar dos vars ...)
T4NK3R
1

Primeiro, você pode dar ao objeto Date (classe) do JavaScript o novo método 'fromYMD ()' para converter o formato de data YMD do MySQL em formato JavaScript, dividindo o formato YMD em componentes e usando estes componentes de data:

Date.prototype.fromYMD=function(ymd)
{
  var t=ymd.split(/[- :]/); //split into components
  return new Date(t[0],t[1]-1,t[2],t[3]||0,t[4]||0,t[5]||0);
};

Agora você pode definir seu próprio objeto (funcion no mundo JavaScript):

function DateFromYMD(ymd)
{
  return (new Date()).fromYMD(ymd);
}

e agora você pode simplesmente criar uma data a partir do formato de data do MySQL;

var d=new DateFromYMD('2016-07-24');
sbrbot
fonte
0

Você pode usar o timestamp unix para direcionar:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Em seguida, coloque epoch_time no JavaScript, e é uma questão simples de:

var myDate = new Date(epoch_time * 1000);

A multiplicação por 1000 ocorre porque o JavaScript leva milissegundos e UNIX_TIMESTAMP fornece segundos.

bharat
fonte
-3

Uma pesquisa rápida no google forneceu o seguinte:

 function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
  }

Fonte: http://snippets.dzone.com/posts/show/4132

Stefan Valianu
fonte
-4

Por que não fazer isso:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
fonte
2
parseDate não é um método JS do objeto Date. Eventualmente, existe um método de análise estática, mas ele aceita apenas 1 argumento.
Marco Demaio