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!


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


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

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.


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)

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

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

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)


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

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

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

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.


-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


-4

Por que não fazer isso:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.