Formatowanie daty w javascripcie do użytku w MySQL

Data publikacji: 2014-06-01 | Tagi:

Na temat daty w javascripcie napisać można jeszcze więcej złego, niż zostało napisane do tej pory :). Ale ten post nie będzie traktował o tym. Dziś pokażę jak uzupełnić dane zerami tak, by pasowały do np. zapytań MySQL.

Pierwsza styczność z Date() w javascripcie wywołuje tylko myśl "spoko - to proste", ale strome schody zaczynają się chwilę później.

Załóżmy, że jest obecnie 1 czerwca 2014 roku, 3 minuty po 1 rano - zupełnie przyzwoita pora dla programisty. Jak taka data będzie wyglądała w MySQL?

2014-06-01 01:03:00

String łatwy, prosty i przyjemny. Da się go splitować, ma przewidywalne miejsca wystąpień poszczególnych separatorów oraz danych. To naprawdę dobry i uniwersalny format - zgodzi się z tym chyba każdy.

Jak taka data wyglądałaby w javascripcie?

Sun Jun 01 2014 01:03:00 GMT+0200 (CEST)

No niby wszystko w porządku, tylko format jakiś dziwny. Sformatujmy go pod MySQL.

var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();  // haha, nie ma łatwo - nie getDay tylko getDate :)
var hour = date.getHours();
var minute = date.getMinutes();
var second = date.getSeconds();

console.log(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);

Wynik:

2014-5-1 1:3:0

Wow! Coś tu jest srodze nie tak. Nie dość że brak poprzedzających zer, to jeszcze miesiąc zamiast czerwca został majem. Czyli javascript liczy miesiące jak programista - zaczynając od zera, natomiast dni już od 1 :).

Co w takim wypadku zrobić? Podjeść jest tyle, ile osób się za to zabiera. Ja korzystam z pewnej zależności/reguły: oprócz roku wszystkie dane mają docelową długość dwóch znaków, zatem mogę do każdej z nich dodać poprzedzające '0' i przyciąć wynik do dwóch ostatnich znaków, pamiętając o dodaniu 1 do miesiąca.

var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
var hour = ('0' + date.getHours()).slice(-2);
var minute = ('0' + date.getMinutes()).slice(-2);
var second = ('0' + date.getSeconds()).slice(-2);

console.log(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);

Wynik:

2014-06-01 01:03:00

Czyli dokładnie to, o co nam chodziło.

Wyjaśnienie - jeśli dzień wynosi 1 to dodanie '0' i obcięcie do dwóch ostatnich znaków da w rezultacie '01'. Jeśli dzień wynosi 23 to dodanie '0' i obcięcie do dwóch ostatnich znaków da w rezultacie '23'.

Jeśli macie lepszą metodę to proszę podzielcie się nią w komentarzach.


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: