Konwertuj z MySQL datetime na inny format za pomocą PHP


447

Mam datetimekolumnę w MySQL.

Jak mogę przekonwertować go na wyświetlacz jako mm / dd / rr H: M (AM / PM) przy użyciu PHP?


4
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

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

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)


19
ta odpowiedź jest myląca dla tematu
— Alex K,

5
@ 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)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Zapoznaj się z opcjami formatowania daty PHP, aby dostosować format.


Skąd ten $rowobiekt ma pochodzić?
— Mike

25
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ą.
— Clément

110

Jeśli używasz PHP 5, możesz także spróbować

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

Jak stwierdzono powyżej w komentarzach, standardowy format to("Y-m-d H:i:s")
— Yannickv

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Odniesienie: http://php.net/manual/en/function.date.php


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)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');

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.


11
-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”.
— Boris Šuška

10

Zapomnieć wszystko. Po prostu użyj:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

9

Aby poprawnie sformatować DateTimeobiekt 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.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

To oraz lista innych stałych PHP DateTime są dostępne na stronie http://php.net/manual/en/class.datetime.php#datetime.constants.types


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'.
— toksalot

7

Użyj funkcji daty :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>

25
Czy funkcja date () nie oczekuje znacznika czasu liczby całkowitej zamiast daty i godziny określonej w pytaniu?
— Loftx

5

W zależności od konfiguracji daty i godziny MySQL. Zazwyczaj: 2011-12-31 07:55:13 . Ta bardzo prosta funkcja powinna wykonać magię:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Lub trochę więcej, aby dopasować pytanie.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
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.

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.


3

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

1
Nie konwertuje to daty na format żądany przez OP.
— toksalot

1

To zadziała ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

1
Ten format miesza się 24 razy z AM / PM. W przeciwnym razie jest to to samo, co zaakceptowana odpowiedź wysłana ponad 5 lat temu.
— toksalot

0

W przypadku PHP w wersji 4.4.9 i MySQL 5.0 działało to dla mnie:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDatejest kolumna w MySQL .


Nie konwertuje to daty na format żądany przez OP
— toxalot

0

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(
    new FromISO8601('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 .


-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

1
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.
— toksalot
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.