2010-06-19 34 views
140

¿Alguien sabe cómo puedo tener un valor de tipo de datos datetime MySQL, como YYYY-MM-DD HH:MM:SS y, o bien analizarlo o convertirlo a trabajar en función de JavaScript Date(), por ejemplo: - Fecha ('AAAA , MM, DD, HH, MM, SS);Convertir sello MySql DateTime en formato de Fecha de JavaScript

¡Gracias!

+0

Luego de hacer todo esto, me parece que las fechas Javascript no tienen una manera fácil de agregar fechas ... –

Respuesta

370

Algunas de las respuestas que se dan aquí son o bien demasiado complicado o simplemente no va a funcionar (al menos, no en todos los navegadores). Si das un paso atrás, puedes ver que la marca de tiempo de MySQL tiene cada componente de tiempo en el mismo orden que los argumentos requeridos por el constructor Date().

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) 

Feria de advertencia: esto supone que el servidor MySQL está emitiendo fechas UTC (que es el valor por defecto, y recomienda si no hay un componente zona horaria de la cuerda).

+1

¡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 sello de tiempo MySQL, por ejemplo. 'var d = new Date (" 2010-06-09 13:12:01 ");'. Aunque curiosamente, Chrome no tiene ningún problema con eso. – alnafie

+1

worthy ... for +1 –

+0

Esto vale tantos + 1s, gracias Andy E – Greg

-2

Una búsqueda rápida en Google siempre 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

-3

Por qué no hacer esto:

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

parseDate no es un método JS del objeto Date. Finalmente, hay un método de análisis estático pero acepta solo 1 argumento. –

57

Para añadir a la excelente Andy E answer 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 este modo, dado un MySQL fecha/hora en la forma "YYYY-MM-DD HH:MM:SS" o incluso la forma abreviada (única 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()); 
+1

debe utilizar 'new Date (Date.UTC (...))' de lo contrario, la respuesta es incorrecta hasta 24 horas ... – user3338098

7

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

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

Creo que puede haber encontrado una forma más simple, que nadie mencionó.

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

SELECT unix_timestamp(my_datetime_column) as stamp ... 

Podemos hacer un nuevo objeto Date de JavaScript mediante el constructor que requiere milisegundos desde el tiempo. La función UNIX_TIMESTAMP vuelve 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 utilizar directamente para crear instancias de un Javascript Fecha de objeto correcto:

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

Espero que esto ayude.

+2

Sí, la manera fácil y eficiente. Pero, presionaría la multiplicación (* 1000) de la marca de tiempo Unix en el cliente (en javascript) – Reinsbrain

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

+1 para no evocar expresiones regulares. (Ahora, si pudiéramos convertirlo en un delineador y deshacernos de los vars ...) – T4NK3R

2

Para agregar aún más a la solución de Marco. Prototipé 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 usted puede ir directamente a:

var mySqlTimestamp = "2011-02-20 17:16:00"; 
var pickupDate = mySqlTimestamp.mysqlToDate(); 
13

Un forro 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 sólo por diversión, aquí hay una sola línea que se funciona en navegadores más antiguos (ahora corregidos):

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

El segundo ejemplo ("one-liner que funcionará en los navegadores más antiguos") me da una fecha de un mes en el futuro. Creo que el param del mes tiene índice cero. – nickyspag

+0

@nickyspag bummer! lo arregló usando map() pero ya no es tan breve. – aleemb

+0

EXCELENTE respuesta ... todos funcionaron, especialmente el primero –

2

De Andy's Answer, 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; 
      }; 
     }); 
+0

Hola y gracias a Jaym. Esto resolvió una fecha rota en una aplicación angular que construí para iOS. – mediaguru

1

En primer lugar se puede dar objeto Date de JavaScript (clase) el nuevo método 'fromYMD()' para la conversión de formato de fecha AMD de MySQL en formato JavaScript mediante el fraccionamiento de formato de AMD en sus componentes y el uso de estos componentes de la 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); 
}; 

ya se 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 de MySQL;

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

Puede utilizar marca de tiempo Unix para dirigir:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

continuación, obtener la epoch_time en JavaScript, y es una simple cuestión de:

var myDate = new Date(epoch_time * 1000);

La multiplicación por 1000 es porque JavaScript tarda milisegundos, y UNIX_TIMESTAMP da segundos.

Cuestiones relacionadas