Konwertuj znacznik daty i godziny MySql na format daty JavaScript

160

Czy ktoś wie, jak mogę wziąć datetimewartość typu danych MySQL , taką jak YYYY-MM-DD HH:MM:SSi albo ją przeanalizować, albo przekonwertować do pracy w Date()funkcji JavaScript , na przykład: - Data ('RRRR, MM, DD, HH, MM, SS);

Dziękuję Ci!

dzm
źródło
Po wykonaniu tego wszystkiego stwierdzam, że Javascript Dates nie mają łatwego sposobu na dodawanie dat ...
Kolob Canyon

Odpowiedzi:

418

Niektóre z udzielonych tutaj odpowiedzi są albo zbyt skomplikowane, albo po prostu nie będą działać (przynajmniej nie we wszystkich przeglądarkach). Jeśli cofniesz się o krok, zobaczysz, że sygnatura czasowa MySQL ma każdy składnik czasu w tej samej kolejności, co argumenty wymagane przez Date()konstruktor.

Wszystko, czego potrzeba, to bardzo prosty podział na ciąg:

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

Uczciwe ostrzeżenie: zakłada się, że serwer MySQL wyświetla daty UTC (co jest domyślne i zalecane, jeśli w ciągu nie ma składnika strefy czasowej).

Andy E.
źródło
3
Bardzo dziękuję za to eleganckie rozwiązanie! Musiałem go użyć, ponieważ Safari nie wydaje się być w stanie automatycznie wygenerować obiektu Date z ciągu znacznika czasu MySQL, np. var d = new Date("2010-06-09 13:12:01");. Co ciekawe, Chrome nie ma z tym problemu.
Alnafie
i pomyśleć, że inne odpowiedzi sugerują bardziej złożone rozwiązanie. Wielkie dzięki!
RD
To jest zła odpowiedź. Poprawną odpowiedź zamieścił poniżej Symen Timmermans. Wszystkie daty są serializowane (przechowywane) jako liczba licząca albo sekundy (w przypadku uniksowego znacznika czasu), albo milisekundy (javascript) od 1970 UTC. Manipulowanie ciągami dat, które są zawiłymi reprezentacjami tej liczby, to marnotrawstwo zasobów. Po prostu podaj uniksowy znacznik czasu (pomnożony przez 1000 dla milisekund) do konstruktora daty javascript (zgodnie z sugestią Symena Timmermansa) i już go masz.
Reinsbrain
1
@Reinsbrain: To nie jest zła odpowiedź, tylko taka, która nie spełniała Twoich wymagań. Jest różnica. Co się stanie, jeśli osoba wdrażająca nie ma dostępu do kodu serwera wykonującego zapytanie MySQL (może to być jakiś rodzaj usługi sieciowej)? A jeśli łatwiej będzie edytować kod po stronie klienta, ponieważ zmiana go na serwerze oznaczałaby więcej pracy? Nie ma sensu dzielić włosów na kilka bajtów, które mogłyby stać się nieistotne przez gzipowanie, lub dziesięciotysięczne części milisekundy potrzebne do podzielenia łańcucha.
Andy E
4
uh mysql używa jednej strefy czasowej, a konstruktor daty javascript akceptuje tylko lokalną strefę czasową, co powoduje, że to rozwiązanie jest błędne nawet o 24 godziny ... to new Date(Date.UTC(...))jest lepsze, ale zakłada się, że mysql używa utc ... tak czy inaczej musi to być rozważone, zanim będzie można to uznać za poprawną odpowiedź.
user3338098
64

Aby dodać do doskonałej odpowiedzi Andy E, często używaną funkcją może być:

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

W ten sposób podając datę / czas MySQL w formularzu "YYYY-MM-DD HH:MM:SS"lub nawet w formie skróconej (tylko data) "YYYY-MM-DD"możesz zrobić:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
Marco Demaio
źródło
3
powinieneś użyć new Date(Date.UTC(...))innego mądrego odpowiedź jest błędna do 24 godzin ...
user3338098
30

Myślę, że mogłem znaleźć prostszy sposób, o którym nikt nie wspomniał.

Kolumnę MySQL DATETIME można przekonwertować na uniksowy znacznik czasu poprzez:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Możemy stworzyć nowy obiekt Date w JavaScript używając konstruktora, który wymaga milisekund od epoki. Funkcja unix_timestamp zwraca sekundy od epoki, więc musimy pomnożyć przez 1000:

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

Wynikowa wartość może zostać użyta bezpośrednio do utworzenia instancji poprawnego obiektu Date Javascript:

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

Mam nadzieję że to pomoże.

Symen Timmermans
źródło
4
Tak, skuteczny łatwy sposób. Ale popchnąłbym mnożenie (* 1000) znacznika czasu uniksowego na klienta (w javascript)
Reinsbrain Kwietnia
16

Jedna linijka dla nowoczesnych przeglądarek (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)

I dla zabawy, oto jeden wiersz, który będzie działał w starszych przeglądarkach (teraz naprawiony):

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
źródło
1
Drugi przykład („jedna linijka, która będzie działać w starszych przeglądarkach”) podaje datę za miesiąc w przyszłości. Myślę, że parametr miesiąca jest indeksowany przez zero.
nickyspag
@nickyspag bummer! naprawiono to za pomocą map (), ale już nie tak zwięźle.
aleemb
DOSKONAŁA odpowiedź… wszyscy zadziałali, zwłaszcza pierwsza
David Addoteye
7

Najnowsze wersje JavaScript odczytują datę w formacie ISO8601, więc wszystko, co musisz zrobić, to zmienić spację na „T”, wykonując jedną z następujących czynności:

#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
źródło
3

Aby jeszcze bardziej rozszerzyć rozwiązanie Marco. Prototypowałem bezpośrednio do obiektu 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);
};

W ten sposób możesz przejść bezpośrednio do:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();
Adrian Bartholomew
źródło
3

Jest prostszy sposób, ciąg sql timestamp:

2018-07-19 00:00:00

Najbliższy format do znacznika czasu dla Date () do odebrania jest następujący, więc zastąp puste miejsce dla „T”:

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

„2011-10-10T14: 48: 00”

Następnie utwórz obiekt daty:

var date = new Date(dateString);

wynikiem byłby obiekt daty:

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

Caique Matos
źródło
2

Z odpowiedzi Andy'ego , dla AngularJS - Filtr

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
źródło
Cześć i dzięki jaym. To rozwiązało problem z nieprawidłową datą w aplikacji kątowej, którą stworzyłem na 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
źródło
+1 za niewywoływanie wyrażeń regularnych. (Teraz, gdybyśmy mogli po prostu zmienić go w oneliner i pozbyć się
varów
1

Najpierw możesz nadać obiektowi Date (klasa) JavaScript nową metodę 'fromYMD ()' do konwersji formatu daty YMD MySQL na format JavaScript, dzieląc format YMD na komponenty i używając następujących komponentów daty:

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

Teraz możesz zdefiniować swój własny obiekt (funkcja w świecie JavaScript):

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

a teraz możesz po prostu utworzyć datę z formatu daty MySQL;

var d=new DateFromYMD('2016-07-24');
sbrbot
źródło
0

Możesz użyć unix timestamp do bezpośredniego:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Następnie pobierz epoch_time do JavaScript i jest to prosta sprawa:

var myDate = new Date(epoch_time * 1000);

Mnożenie przez 1000 wynika z tego, że JavaScript zajmuje milisekundy, a UNIX_TIMESTAMP podaje sekundy.

bharat
źródło
-3

Szybkie wyszukiwanie w Google zapewniło to:

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

Źródło: http://snippets.dzone.com/posts/show/4132

Stefan Valianu
źródło
-4

Dlaczego tego nie zrobić:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
źródło
2
parseDate nie jest metodą JS obiektu Date. Ostatecznie istnieje statyczna metoda analizy, ale akceptuje tylko 1 argument.
Marco Demaio,