Musimy wiedzieć, jak data jest przechowywana w SQL. Czy to znacznik czasu, data lub godzina czy czas uniksowy?
Ólafur Waage,
Nie są przechowywane w czasie uniksowym, podobnie jak normalna data, PHP zajmuje się tym w sekundach. Poleciłbym ci korzystanie z OOPfunkcji datetime PHP , są one bardzo łatwe w użyciu.
Gucho Ca
2
Czy mogę polecić alternatywny format daty? mm/dd/yyjest bardzo amerykański i ci z nas, którzy mieszkają w innych częściach świata, stają się bardziej niż trochę rozdrażnieni, próbując odgadnąć, co to znaczy 11-12-13. Bardziej uniwersalny standard jest yyyy-mm-ddi jest częścią normy ISO 8601. W przeciwnym razie powinieneś użyć nazwy miesiąca , a nie numeru.
Manngo,
Odpowiedzi:
515
Jeśli szukasz sposobu na normalizację daty do formatu MySQL, skorzystaj z poniższych
Linia $phpdate = strtotime( $mysqldate ) akceptuje ciąg i wykonuje serię heurystyki, aby przekształcić go w uniksowy znacznik czasu.
Linia $mysqldate = date( 'Y-m-d H:i:s', $phpdate )używa tego znacznika czasu i kodu PHPdate funkcji aby przekształcić ten znacznik czasu z powrotem w standardowy format daty MySQL.
( Edytor Uwaga : Ta odpowiedź jest tutaj z powodu pierwotnego pytania o mylące sformułowanie, a ogólna przydatność Google ta odpowiedź pod warunkiem, nawet jeśli nie zrobił”bezpośrednio odpowiedzieć na pytanie, które teraz istnieje)
@ 0xBAADF00D: przeczytaj ponownie pytanie ... nikt nie pytał o standardowy format MySQL.
user7116
3
oczywiście, ale gdy istnieje standard, może być miło postępować zgodnie ze standardem (pozwala uniknąć bólu głowy później, gdy inny program pracuje nad twoim kodem) xD
0xBAADF00D
4
Pytanie dotyczy wyjścia w formacie mm / dd / rr H: M (AM / PM), a nie „Ymd H: i: s”.
Rikki
6
does not workdla kogo? Zaakceptowana odpowiedź zadziała, jeśli chcesz przekonwertować z MySQL na mm / dd / rr H: M (AM / PM) zgodnie z żądaniem OP. Tylko dlatego, że chcesz zrobić coś przeciwnego, nie sprawia, że zaakceptowana odpowiedź jest zła.
toksalot
311
Aby przekonwertować datę pobraną z MySQL na żądany format ( mm/dd/yy H:M (AM/PM)):
Mogę się mylić, ale myślę, że niektórzy z was nie rozumieją sedna sprawy. Chce, aby dane wyjściowe były w formacie „m / d / yg: i A”, wyciągając pierwotną datę z pola DATETIME. Więc jego kod działa. @Mike $ row-> utworzony jest tylko kolumną czasu i daty Tima.
Mere Development
4
Odpowiedź @AsTeR jest myląca tylko w przypadku błędnego odczytania pytania. OP odpowiedział na własne pytanie i chce pobrać datę z MySQL i przekazać dane do żądanego formatu: mm / dd / rr H: M (AM / PM) .
toksalot
@ TimBoland Myślę, że odpowiedź mogłaby zostać poprawiona, gdyby podkreślono from, a także żądany format mm / dd / rr H: M (AM / PM) . I może skorzystać z linku do funkcji daty. Próbowałem zasugerować edycję , ale została odrzucona.
toksalot
1
Ciekawostka: ta odpowiedź jest w przybliżeniu równoważna z odpowiedzią poniżej (która praktycznie nie ma ocen negatywnych), ale uzyskała> 40 ocen negatywnych, ponieważ odpowiada na pytanie PO, które różni się od tego, które ludzie, którzy odwiedzają tę stronę, faktycznie mają.
Myślę, że ludzie głosują z góry, ponieważ są zdezorientowani pytaniem OP. Większość czytających pytanie jest przeciwieństwem tego, co naprawdę jest. Inną możliwością jest to, że jest to bardzo podobne do zaakceptowanej odpowiedzi opublikowanej ponad 5 lat temu.
toksalot
1
Odnośnik, do którego się odwołujesz, nie wskazuje używanej funkcji ani nie wyjaśnia formatu. Myślę, że php.net/function.date.php byłby lepszy.
toksalot
@toxalot Przyjęta odpowiedź jest nieprawidłowa. Edytowałem po mojej odpowiedzi i na temat mojego linku zastępuję twój link. Dzięki
Tony Stark,
1
Całe to pytanie ma obrzydliwą historię. Przyjęta odpowiedź była niepoprawna między 29 kwietnia 2013 r. A 24 maja 2013 r. Była poprawna, kiedy opublikowałeś swoją odpowiedź. Twoja odpowiedź była błędna do 29 maja 2013 r., Po czym stała się bardzo podobna do zaakceptowanej.
toksalot
23
Wreszcie właściwe rozwiązanie dla PHP 5.3 i nowszych:
(dodano opcjonalną strefę czasową do przykładu, jak wspomniano w komentarzach)
jego błąd .. Nie znaleziono klasy „App \ Controller \ DateTime” .. używając php 6.4
aswzen
1
Jeśli pracujesz w innej przestrzeni nazw, musisz nazwać ją odwrotnym ukośnikiem:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester,
2
Nie zapomnij podać strefy czasowej podczas tworzenia obiektu daty! W przeciwnym razie sformatowana data może być kilka godzin wolnego. Twoje datetimekolumny powinny mieć format UTF8, więc przekaż new DateTimeZone('UTC')jako trzeci parametr, aby PHP wiedział.
Eric Seastrand
To jest poprawna odpowiedź, która wyświetla pożądany format PO, po prostu zadbaj o strefy czasowe
Księgowy م
12
Łatwiejszym sposobem byłoby sformatowanie daty bezpośrednio w zapytaniu MySQL zamiast w PHP. Zobacz ręczny wpis MySQL dla DATE_FORMAT .
Jeśli wolisz to zrobić w PHP, potrzebujesz funkcji daty , ale najpierw musisz przekonwertować wartość bazy danych na znacznik czasu.
-1, ponieważ formatowanie daty w DB nie jest dobrym pomysłem. Wielojęzyczne strony internetowe wymagają różnych formatów dat, a następnie musisz sformatować datę w PHP (wspólny język logiki biznesowej). Kiedy piszesz o datefunkcji, powinieneś napisać o strottimefunkcji, aby pomóc komuś zamiast „ale najpierw musisz przekonwertować wartość bazy danych na znacznik czasu”.
MySQL tak naprawdę nie używa tego formatu, a MySQL generuje ostrzeżenie, jeśli dołączasz oznaczenie strefy czasowej „+ xxxx”, które jest przez niego generowane. AKTUALIZACJA X ZESTAW Y = „2014-03-31T15: 00: 00 + 0100” gdzie Z; Zapytanie OK, wpłynęło 0 wierszy, 1 ostrzeżenie (0,06 s) Dopasowane wiersze: 1 Zmieniono: 0 Ostrzeżenia: 1
George Lund
OP chce pobrać datę z formatu MySQL i przekonwertować na mm / dd / rr H: M (AM / PM) .
toksalot
8
To powinno sformatować pole w zapytaniu SQL:
SELECT DATE_FORMAT(`fieldname`,'%d-%m-%Y') FROM tablename
Należy podać zapytanie MySQL , a nie tylko SQL, ponieważ niekoniecznie będzie to działać ze wszystkimi bazami danych. Chociaż OP poprosił o rozwiązanie PHP, jest to dobra alternatywa, o której OP mógł nie wiedzieć. Nie zapewni to jednak wymaganego formatu. Aby uzyskać żądany format OP, potrzebujesz '%m/%d/%y %h:%i %p'.
To nie odpowiada na pytanie OP. OP chce pobrać datę z formatu MySQL i przekonwertować na mm / dd / rr H: M (AM / PM) . Plus to po prostu sformatuje bieżącą godzinę, a nie konkretną datę.
toksalot
5
SELECT
DATE_FORMAT(demo.dateFrom,'%e.%M.%Y')as dateFrom,
DATE_FORMAT(demo.dateUntil,'%e.%M.%Y')as dateUntil
FROM demo
Jeśli nie chcesz zmieniać wszystkich funkcji w kodzie PHP, aby wyświetlić oczekiwany format daty, zmień go u źródła - w bazie danych.
Ważne jest, aby nazwać wiersze znakiem as operatora, jak w powyższym przykładzie (jak dateFrom jak dateUntil). Nazwiska, które tam piszesz, są nazwami, wiersze zostaną wywołane w wyniku.
Możesz również poprosić, aby zapytanie zwróciło czas jako znacznik czasu Unix. Pozbyłoby się to potrzeby dzwonienia strtotime()i sprawiłoby, że po stronie PHP byłoby trochę mniej intensywnie ...
select UNIX_TIMESTAMP(timsstamp)as unixtime from the_table where id =1234;
Następnie w PHP wystarczy użyć date()funkcji, aby sformatować ją w dowolny sposób.
<?php
echo date('l jS \of F Y h:i:s A', $row->unixtime);?>
lub
<?php
echo date('F j, Y, g:i a', $row->unixtime);?>
I jakby tego podejścia w przeciwieństwie do używania MySQL S”DATE_FORMAT funkcję, ponieważ pozwala na ponowne użycie tego samego zapytania, aby pobrać dane i pozwala na zmianę formatowania w PHP.
To denerwujące, że dwa różne zapytania służą tylko do zmiany wyglądu daty w interfejsie użytkownika.
Podoba mi się pomysł, UNIX_TIMESTAMPaby wyeliminować potrzebę strtotime. Ta odpowiedź byłaby lepsza, gdyby podała przykład formatowania czasu w faktycznie żądanym formacie OP.
toksalot
1
Możesz mieć problemy z datami, które nie zostały zwrócone w Uniksowym znaczniku czasu, więc to działa dla mnie ...
return date("F j, Y g:i a", strtotime(substr($datestring,0,15)))
Podejście, które sugeruję, działa w następujący sposób. Najpierw tworzysz podstawowy obiekt daty / godziny z ciągu sformatowanego w mysql; a następnie sformatujesz go tak, jak lubisz. Na szczęście mysql datetime jest zgodny z ISO8601, więc sam kod może wyglądać dość prosto i elegancko. Pamiętaj, że ta datetimekolumna nie zawiera informacji o strefie czasowej, więc musisz odpowiednio ją przekonwertować .
Oto kod:
(new ISO8601Formatted(newFromISO8601('2038-01-19 11:14:07'),'m/d/Y h:iA'))->value();
Wyprowadza 01/19/2038 11:14AM- mam nadzieję, że oczekujesz.
W tym przykładzie użyto biblioteki bezowej. Jeśli chcesz, możesz sprawdzić więcej .
To nie odpowiada na pytanie OP. OP chce pobrać datę z formatu MySQL i przekonwertować na mm / dd / rr H: M (AM / PM) . Robi to odwrotnie. Dodatkowo pobiera dane z formularza, a nie z bazy danych.
OOP
funkcji datetime PHP , są one bardzo łatwe w użyciu.mm/dd/yy
jest bardzo amerykański i ci z nas, którzy mieszkają w innych częściach świata, stają się bardziej niż trochę rozdrażnieni, próbując odgadnąć, co to znaczy11-12-13
. Bardziej uniwersalny standard jestyyyy-mm-dd
i jest częścią normy ISO 8601. W przeciwnym razie powinieneś użyć nazwy miesiąca , a nie numeru.Odpowiedzi:
Jeśli szukasz sposobu na normalizację daty do formatu MySQL, skorzystaj z poniższych
Linia
$phpdate = strtotime( $mysqldate )
akceptuje ciąg i wykonuje serię heurystyki, aby przekształcić go w uniksowy znacznik czasu.Linia
$mysqldate = date( 'Y-m-d H:i:s', $phpdate )
używa tego znacznika czasu i kodu PHPdate
funkcji aby przekształcić ten znacznik czasu z powrotem w standardowy format daty MySQL.( Edytor Uwaga : Ta odpowiedź jest tutaj z powodu pierwotnego pytania o mylące sformułowanie, a ogólna przydatność Google ta odpowiedź pod warunkiem, nawet jeśli nie zrobił”bezpośrednio odpowiedzieć na pytanie, które teraz istnieje)
źródło
does not work
dla kogo? Zaakceptowana odpowiedź zadziała, jeśli chcesz przekonwertować z MySQL na mm / dd / rr H: M (AM / PM) zgodnie z żądaniem OP. Tylko dlatego, że chcesz zrobić coś przeciwnego, nie sprawia, że zaakceptowana odpowiedź jest zła.Aby przekonwertować datę pobraną z MySQL na żądany format (
mm/dd/yy H:M (AM/PM)
):Zapoznaj się z opcjami formatowania daty PHP, aby dostosować format.
źródło
$row
obiekt ma pochodzić?Jeśli używasz PHP 5, możesz także spróbować
źródło
("Y-m-d H:i:s")
Odniesienie: http://php.net/manual/en/function.date.php
źródło
Wreszcie właściwe rozwiązanie dla PHP 5.3 i nowszych: (dodano opcjonalną strefę czasową do przykładu, jak wspomniano w komentarzach)
źródło
\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
datetime
kolumny powinny mieć format UTF8, więc przekażnew DateTimeZone('UTC')
jako trzeci parametr, aby PHP wiedział.Łatwiejszym sposobem byłoby sformatowanie daty bezpośrednio w zapytaniu MySQL zamiast w PHP. Zobacz ręczny wpis MySQL dla DATE_FORMAT .
Jeśli wolisz to zrobić w PHP, potrzebujesz funkcji daty , ale najpierw musisz przekonwertować wartość bazy danych na znacznik czasu.
źródło
date
funkcji, powinieneś napisać ostrottime
funkcji, aby pomóc komuś zamiast „ale najpierw musisz przekonwertować wartość bazy danych na znacznik czasu”.Zapomnieć wszystko. Po prostu użyj:
źródło
Aby poprawnie sformatować
DateTime
obiekt w PHP do przechowywania w MySQL, użyj standardowego formatu używanego przez MySQL, czyli ISO 8601 .PHP ma ten format przechowywany jako stały od wersji 5.1.1, i zdecydowanie zalecam używanie go zamiast ręcznego wpisywania łańcucha za każdym razem.
To oraz lista innych stałych PHP DateTime są dostępne na stronie http://php.net/manual/en/class.datetime.php#datetime.constants.types
źródło
To powinno sformatować pole w zapytaniu SQL:
źródło
'%m/%d/%y %h:%i %p'
.Użyj funkcji daty :
źródło
W zależności od konfiguracji daty i godziny MySQL. Zazwyczaj: 2011-12-31 07:55:13 . Ta bardzo prosta funkcja powinna wykonać magię:
Lub trochę więcej, aby dopasować pytanie.
źródło
Jeśli nie chcesz zmieniać wszystkich funkcji w kodzie PHP, aby wyświetlić oczekiwany format daty, zmień go u źródła - w bazie danych.
Ważne jest, aby nazwać wiersze znakiem as operatora, jak w powyższym przykładzie (jak dateFrom jak dateUntil). Nazwiska, które tam piszesz, są nazwami, wiersze zostaną wywołane w wyniku.
Wyjście z tego przykładu będzie
[Dzień miesiąca, numerycznie (0..31)]. [Nazwa miesiąca (styczeń .. grudzień)]. [Rok, numerycznie, cztery cyfry]
Przykład: 5. sierpnia 2015 r
Zmień kropki za pomocą separatora i sprawdź funkcję DATE_FORMAT (data, format), aby uzyskać więcej formatów dat.
źródło
Możesz również poprosić, aby zapytanie zwróciło czas jako znacznik czasu Unix. Pozbyłoby się to potrzeby dzwonienia
strtotime()
i sprawiłoby, że po stronie PHP byłoby trochę mniej intensywnie ...Następnie w PHP wystarczy użyć
date()
funkcji, aby sformatować ją w dowolny sposób.lub
I jakby tego podejścia w przeciwieństwie do używania MySQL S”
DATE_FORMAT
funkcję, ponieważ pozwala na ponowne użycie tego samego zapytania, aby pobrać dane i pozwala na zmianę formatowania w PHP.To denerwujące, że dwa różne zapytania służą tylko do zmiany wyglądu daty w interfejsie użytkownika.
źródło
UNIX_TIMESTAMP
aby wyeliminować potrzebęstrtotime
. Ta odpowiedź byłaby lepsza, gdyby podała przykład formatowania czasu w faktycznie żądanym formacie OP.Możesz mieć problemy z datami, które nie zostały zwrócone w Uniksowym znaczniku czasu, więc to działa dla mnie ...
źródło
To zadziała ...
źródło
W przypadku PHP w wersji 4.4.9 i MySQL 5.0 działało to dla mnie:
PubDate
jest kolumna w MySQL .źródło
Podejście, które sugeruję, działa w następujący sposób. Najpierw tworzysz podstawowy obiekt daty / godziny z ciągu sformatowanego w mysql; a następnie sformatujesz go tak, jak lubisz. Na szczęście mysql datetime jest zgodny z ISO8601, więc sam kod może wyglądać dość prosto i elegancko. Pamiętaj, że ta
datetime
kolumna nie zawiera informacji o strefie czasowej, więc musisz odpowiednio ją przekonwertować .Oto kod:
Wyprowadza
01/19/2038 11:14AM
- mam nadzieję, że oczekujesz.W tym przykładzie użyto biblioteki bezowej. Jeśli chcesz, możesz sprawdzić więcej .
źródło
źródło