Convierta el sello MySql DateTime al formato de fecha de JavaScript

160

¿Alguien sabe cómo puedo tomar un datetimevalor de tipo de datos MySQL , como YYYY-MM-DD HH:MM:SSanalizarlo o convertirlo para que funcione en la Date()función de JavaScript , por ejemplo: - Fecha ('AAAA, MM, DD, HH, MM, SS);

¡Gracias!

dzm
fuente
A continuación, después de hacer todo esto, me parece que Javascript fechas no tienen una manera fácil de agregar fechas ...
Kolob Canyon

Respuestas:

418

Algunas de las respuestas dadas aquí son demasiado complicadas o simplemente no funcionarán (al menos, no en todos los navegadores). Si retrocede, puede ver que la marca de tiempo de MySQL tiene cada componente de tiempo en el mismo orden que los argumentos requeridos por el Date()constructor.

Todo lo que se necesita es una división muy simple en la cadena:

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

Advertencia justa: esto supone que su servidor MySQL está emitiendo fechas UTC (que es el valor predeterminado y se recomienda si no hay un componente de zona horaria de la cadena).

Andy E
fuente
3
¡Muchas gracias por esta elegante solución! Tuve que usarlo porque Safari no parece ser capaz de generar automáticamente un objeto Date a partir de una cadena de marca de tiempo MySQL, por ejemplo. var d = new Date("2010-06-09 13:12:01");. Aunque es interesante, Chrome no tiene ningún problema.
alnafie
y pensar que otras respuestas sugirieron una solución más compleja. ¡Muchas gracias!
RD
Esta es la respuesta incorrecta. La respuesta correcta es publicada a continuación por Symen Timmermans. Todas las fechas se serializan (almacenan) como un número que cuenta segundos (en el caso de la marca de tiempo Unix) o milisegundos (javascript) desde 1970 UTC. La manipulación de cadenas de fecha que son representaciones enrevesadas de este número es un desperdicio de recursos. Simplemente pase la marca de tiempo de Unix (multiplicada por 1000 por milisegundos) al constructor de fecha de JavaScript (como lo sugiere Symen Timmermans) y lo tendrá.
Reinsbrain
1
@Reinsbrain: No es la respuesta incorrecta, solo una que no se ajustaba a tus requisitos. Hay una diferencia ¿Qué sucede si el implementador no tiene acceso al código del servidor que realiza la consulta MySQL (quizás algún tipo de servicio web)? ¿Qué pasa si es más fácil editar el código del lado del cliente porque cambiarlo en el servidor significaría más trabajo? No tiene sentido dividir los pelos en unos pocos bytes que podrían volverse insignificantes al comprimir, o las diez milésimas de milisegundo necesarias para dividir una cadena.
Andy E
44
uh mysql usa una zona horaria y el constructor de la fecha de javascript solo acepta la zona horaria local, lo que hace que esta solución sea incorrecta por hasta 24 horas ... new Date(Date.UTC(...))es mejor, pero eso supone que mysql usa utc ... de cualquier manera, esto debe ser considerado antes de esto se puede considerar una respuesta correcta.
user3338098
64

Para agregar a la excelente respuesta de Andy E, una función de uso común podría 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;   
}

De esta manera, dada una fecha / hora MySQL en el formulario "YYYY-MM-DD HH:MM:SS"o incluso en el formulario corto (solo fecha) "YYYY-MM-DD", puede hacer:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
Marco Demaio
fuente
3
deberías estar usando de new Date(Date.UTC(...))otra manera la respuesta es incorrecta por hasta 24 horas ...
user3338098
30

Creo que pude haber encontrado una manera más simple, que nadie mencionó.

Una columna MySQL DATETIME se puede convertir en una marca de tiempo de Unix a través de:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Podemos hacer un nuevo objeto JavaScript Date usando el constructor que requiere milisegundos desde la época. La función unix_timestamp devuelve segundos desde la época, por lo que debemos multiplicar por 1000:

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

El valor resultante se puede usar directamente para crear una instancia de un objeto de fecha Javascript correcto:

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

Espero que esto ayude.

Symen Timmermans
fuente
44
Sí, la manera fácil y eficiente. Pero, empujaría la multiplicación (* 1000) de la marca de tiempo de Unix en el cliente (en JavaScript)
Reinsbrain
16

One liner 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)

Y solo por diversión, aquí hay una línea que funcionará en navegadores antiguos (ahora corregido):

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
fuente
1
El segundo ejemplo ("one-liner que funcionará en navegadores antiguos") me da una fecha un mes en el futuro. Creo que el mes param está indexado a cero.
nickyspag
@nickyspag bummer! lo arregló usando map () pero ya no como sucinto.
aleemb
EXCELENTE respuesta ... todos trabajaron, especialmente el primero
David Addoteye
7

Las versiones recientes de JavaScript leerán una fecha con formato ISO8601, por lo que todo lo que tiene que hacer es cambiar el espacio a una 'T', haciendo algo como lo siguiente:

#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
fuente
3

Para agregar aún más a la solución de Marco. Realicé un prototipo directamente al 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);
};

De esta manera puede ir directamente a:

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

Hay una manera más simple, cadena de marca de tiempo sql:

2018-07-19 00:00:00

El formato más cercano a la indicación de fecha y hora para recibir Fecha () es el siguiente, por lo que debe reemplazar el espacio en blanco para "T":

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

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

Luego, cree el objeto de fecha:

var date = new Date(dateString);

El resultado sería el objeto de fecha:

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

Caique Matos
fuente
2

De la respuesta 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
fuente
Hola y gracias a Jaym. Esto resolvió una fecha rota en una aplicación angular que construí para 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
fuente
+1 por no evocar expresiones regulares. (Ahora, si pudiéramos convertirlo en una línea y deshacerse de los vars ...)
T4NK3R
1

Primero, puede darle al objeto Fecha (clase) de JavaScript el nuevo método 'fromYMD ()' para convertir el formato de fecha YMD de MySQL en formato JavaScript dividiendo el formato YMD en componentes y utilizando estos componentes de fecha:

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

Ahora puede definir su propio objeto (funcion en el mundo JavaScript):

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

y ahora simplemente puede crear la fecha desde el formato de fecha MySQL;

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

Puede usar la marca de tiempo de Unix para dirigir:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Luego obtenga el epoch_time en JavaScript, y es una simple cuestión de:

var myDate = new Date(epoch_time * 1000);

La multiplicación por 1000 se debe a que JavaScript tarda milisegundos y UNIX_TIMESTAMP da segundos.

Bharat
fuente
-3

Una búsqueda rápida en google proporcionó esto:

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

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

Stefan Valianu
fuente
-4

¿Por qué no hacer esto?

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
fuente
2
parseDate no es un método JS del objeto Date. Finalmente, hay un método de análisis estático, pero solo acepta 1 argumento.
Marco Demaio