Converti il ​​timbro MySql DateTime nel formato data di JavaScript


160

Qualcuno sa come posso prendere un datetimevalore del tipo di dati MySQL , come YYYY-MM-DD HH:MM:SSe analizzarlo o convertirlo per funzionare nella Date()funzione JavaScript , ad esempio: - Data ('AAAA, MM, GG, HH, MM, SS);

Grazie!


Quindi, dopo aver fatto tutto questo, trovo che le date Javascript non abbiano un modo semplice per aggiungere date ...
Kolob Canyon,

Risposte:


418

Alcune delle risposte fornite qui sono o troppo complicate o semplicemente non funzioneranno (almeno, non in tutti i browser). Se fai un passo indietro, puoi vedere che il timestamp di MySQL ha ogni componente del tempo nello stesso ordine degli argomenti richiesti dal Date()costruttore.

Tutto ciò che serve è una divisione molto semplice sulla stringa:

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

Avviso equo: questo presuppone che il tuo server MySQL stia emettendo date UTC (che è l'impostazione predefinita e consigliata se non ci sono componenti del fuso orario della stringa).


3
Grazie mille per questa soluzione elegante! Ho dovuto usarlo perché Safari non sembra essere in grado di generare automaticamente un oggetto Date da una stringa timestamp MySQL, ad es. var d = new Date("2010-06-09 13:12:01");. Sebbene interessante, Chrome non ha problemi con esso.
alnafie,

e pensare che altre risposte suggeriscono una soluzione più complessa. Molte grazie!
RD

Questa è la risposta sbagliata La risposta corretta è pubblicata di seguito da Symen Timmermans. Tutte le date sono serializzate (memorizzate) come un numero che conta secondi (nel caso di un timestamp unix) o millisecondi (javascript) dal 1970 UTC. La manipolazione di stringhe di date che sono rappresentazioni contorte di questo numero è uno spreco di risorse. Basta passare il timestamp unix (moltiplicato per 1000 per millisecondi) al costruttore della data javascript (come suggerito da Symen Timmermans) e il gioco è fatto.
Reinsbrain,

1
@Reinsbrain: non è la risposta sbagliata, solo una che non soddisfa i tuoi requisiti. C'è una differenza Cosa succede se l'implementatore non ha accesso al codice del server che esegue la query MySQL (forse un qualche tipo di servizio Web)? E se fosse più semplice modificare il codice lato client perché cambiarlo sul server significherebbe più lavoro? Non ha senso dividere i peli su alcuni byte che potrebbero essere resi insignificanti con il gzip, o i decimilionesimi di millisecondo richiesti per dividere una stringa.
Andy E

4
mysql usa un fuso orario e il costruttore della data javascript accetta solo il fuso orario locale, rendendo questa soluzione errata fino a 24 ore ... new Date(Date.UTC(...))è meglio, ma ciò presuppone che mysql usi utc ... in entrambi i casi deve essere considerato prima questo può essere considerato una risposta corretta.
user3338098

64

Per aggiungere all'eccellente risposta Andy E una funzione di uso comune potrebbe essere:

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

In questo modo data una data / ora MySQL nel modulo "YYYY-MM-DD HH:MM:SS"o anche la forma abbreviata (solo data) "YYYY-MM-DD"puoi fare:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());

3
dovresti usare new Date(Date.UTC(...))altri saggi la risposta è sbagliata fino a 24 ore ...
user3338098

30

Penso di aver trovato un modo più semplice, che nessuno ha menzionato.

Una colonna MySQL DATETIME può essere convertita in un timestamp unix tramite:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Possiamo creare un nuovo oggetto Date JavaScript utilizzando il costruttore che richiede millisecondi dall'epoca. La funzione unix_timestamp restituisce secondi dall'epoca, quindi dobbiamo moltiplicare per 1000:

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

Il valore risultante può essere utilizzato direttamente per creare un'istanza di un oggetto Date JavaScript corretto:

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

Spero che questo ti aiuti.


4
Sì, il modo semplice ed efficiente. Ma spingerei la moltiplicazione (* 1000) del timestamp unix sul client (in javascript)
Reinsbrain,

16

Una fodera per browser moderni (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 solo per divertimento, ecco un one-liner che funzionerà su browser più vecchi (ora corretti):

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
Il secondo esempio ("one-liner che funzionerà su browser più vecchi") mi dà una data un mese in futuro. Penso che il parametro del mese sia a zero.
nickyspag,

@nickyspag bummer! risolto usando map () ma non più come sintetico.
aleemb,

Risposta ECCELLENTE .. tutti hanno funzionato, specialmente il primo
David Addoteye,

7

Le versioni recenti di JavaScript leggeranno una data formattata ISO8601, quindi tutto ciò che devi fare è cambiare lo spazio in una 'T', facendo qualcosa del tipo:

#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

Da aggiungere ancora di più alla soluzione di Marco. Ho prototipato direttamente l'oggetto 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);
};

In questo modo puoi andare direttamente a:

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

3

Esiste un modo più semplice, stringa timestamp sql:

19-07-2018 00:00:00

Il formato più vicino al timestamp per la data () da ricevere è il seguente, quindi sostituisci lo spazio vuoto per "T":

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

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

Quindi, crea l'oggetto data:

var date = new Date(dateString);

risultato sarebbe l'oggetto data:

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


2

Dalla risposta di Andy , per 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;
            };
        });

Ciao e grazie a Jaym. Ciò ha risolto una data non riuscita in un'app angolare che ho creato per 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 per non evocare espressioni regolari. (Ora, se solo potessimo trasformarlo in un oneliner e sbarazzarci dei var ...)
T4NK3R

1

Per prima cosa puoi dare all'oggetto Date (classe) JavaScript il nuovo metodo 'fromYMD ()' per convertire il formato data YMD di MySQL in formato JavaScript suddividendo il formato YMD in componenti e usando questi componenti 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);
};

Ora puoi definire il tuo oggetto (funzione nel mondo JavaScript):

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

e ora puoi semplicemente creare la data dal formato data di MySQL;

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

0

È possibile utilizzare unix timestamp per dirigere:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Quindi porta epoch_time in JavaScript, ed è una semplice questione di:

var myDate = new Date(epoch_time * 1000);

La moltiplicazione per 1000 è dovuta al fatto che JavaScript richiede millisecondi e UNIX_TIMESTAMP dà secondi.


-3

Una rapida ricerca su Google ha fornito questo:

 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

Perché non farlo:

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

2
parseDate non è un metodo JS dell'oggetto Date. Alla fine esiste un metodo di analisi statica ma accetta solo 1 argomento.
Marco Demaio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.