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?

Tim Boland
źródło
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)

kta
źródło
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.

Tim Boland
źródło
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");
enobrev
źródło
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

Tony Stark
źródło
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');
Hasenpriester
źródło
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.

Lampa błyskowa
źródło
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)))
Nixis
źródło
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

Greg
źródło
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
riz
źródło
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);
?>
Gustavo Carreno
źródło
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));
}
tfont
źródło
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.

Rangel
źródło
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.

phatduckk
źródło
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)))
matt.j.crawford
źródło
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));
Mihir Vadalia
źródło
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 .

Peter Mortensen
źródło
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 .

Vadim Samokhin
źródło
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
źródło
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