Jak przekonwertować datę na znacznik czasu w PHP?


Odpowiedzi:


612


Ta metoda działa na obu systemach Windows i Unix i jest czas-zone świadomy, co jest prawdopodobnie to, co chcesz, jeśli pracujesz z datami .

Jeśli nie zależy Ci na strefie czasowej lub chcesz skorzystać ze strefy czasowej używanej przez serwer:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (To będzie się różnić w zależności od strefy czasowej serwera ...)


Jeśli chcesz określić, w której strefie czasowej, tutaj EST. (Tak samo jak w Nowym Jorku.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


Lub jeśli chcesz korzystać z UTC . (Taki sam jak „ GMT ”.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Niezależnie od tego zawsze dobrym punktem wyjścia jest zachowanie ścisłości podczas analizowania ciągów w ustrukturyzowanych danych. Może zaoszczędzić niewygodnego debugowania w przyszłości. Dlatego zalecam zawsze określać format daty.


2
Elegancki. Zapomniałem o tym!
Do

53
Jak to możliwe, że jeszcze nie otrzymałeś uznania za tę odpowiedź ?!
Mark Tomlin

4
Zupełnie ważna odpowiedź, ale jestem zaskoczony, że odpowiedź Armina Ronachera nie pasowała do niej w pozytywnych opiniach - dwuznaczność ZAWSZE jest zła.
RonLugge,

1
@Devner Wydaje się, że na moim serwerze ten format nie jest obsługiwany. Może jest inaczej z twoim.
Lucas

1
To rozwiązanie może prowadzić do nieoczekiwanego zachowania. Ci, którzy używają PHP 5.3+, powinni przyjąć odpowiedź prof. Falkena , w której ma się pełną kontrolę nad formatem daty.
Luca Fagioli,

185

Istnieje również funkcja strptime (), która oczekuje dokładnie jednego formatu:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900);

4
powinien to być tm_mon zamiast tm_month i tm_mday zamiast tm_day
amarillion

68
Uwaga, funkcja Strptime nie jest dostępna w systemie Windows.
understack

12
W systemach Windows i PHP 5.3.0+ rozważ użycie date_parse_from_formatzamiast strptime.
Erwin Wessels,

1
... ponieważ strptimenie jest zaimplementowany na platformach Windows.
Randell,

Ponieważ jest to wysoko głosowana odpowiedź, czy możesz rozważyć edycję jej do odpowiedzi, która działa zarówno w PHP dla Windows, jak i unixen? I IMHO idealnie powinien wspomnieć o strefach czasowych.
Umowa prof. Falkena została naruszona

126

Z DateTimeAPI :

$dateTime = new DateTime('2008-09-22'); 
echo $dateTime->format('U'); 

// or 

$date = new DateTime('2008-09-22');
echo $date->getTimestamp();

To samo z proceduralnym API:

$date = date_create('2008-09-22');
echo date_format($date, 'U');

// or

$date = date_create('2008-09-22');
echo date_timestamp_get($date);

Jeśli powyższe nie powiedzie się, ponieważ używasz nieobsługiwanego formatu , możesz użyć

$date = DateTime::createFromFormat('!d-m-Y', '22-09-2008');
echo $dateTime->format('U'); 

// or

$date = date_parse_from_format('!d-m-Y', '22-09-2008');
echo date_format($date, 'U');

Zauważ, że jeśli nie ustawisz !, część czasu zostanie ustawiona na bieżącą godzinę, która różni się od pierwszych czterech, które będą używać północy, gdy pominiesz czas.

Jeszcze inną alternatywą jest użycie IntlDateFormatterinterfejsu API:

$formatter = new IntlDateFormatter(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'GMT',
    IntlDateFormatter::GREGORIAN,
    'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');

O ile nie pracujesz ze zlokalizowanymi ciągami dat, łatwiejszym wyborem jest prawdopodobnie DateTime.


15
Poleciłbym to w dzisiejszych czasach.
Do

Arggg. ! Nie zapominaj, że ! znacznik czasu Moja data zmieniał się przy każdym odświeżeniu i doprowadzał mnie do szału - ponieważ DateTime pomogło mi dodać bieżącą godzinę bez pytania ani polecenia. Grrr.

Chcę dodać, że nie polecam niejednoznacznego analizowania dat i że format daty powinien być wyraźnie podany podczas analizowania ciągów dat.
Umowa prof. Falkena została naruszona

114

Bądź ostrożny z takimi funkcjami, jak strtotime()„zgadnij”, co masz na myśli (nie zgaduje oczywiście, że zasady są tutaj ).

Rzeczywiście 22-09-2008zostanie przeanalizowany jako 22 września 2008 r. , Ponieważ jest to jedyna rozsądna rzecz.

Jak zostanie 08-09-2008przeanalizowany? Prawdopodobnie 09 sierpnia 2008 r .

Co 2008-09-50? Niektóre wersje PHP analizują to jako 20 października 2008 .

Jeśli więc masz pewność, że dane wejściowe są w DD-MM-YYYYformacie, lepiej skorzystać z rozwiązania oferowanego przez @Armin Ronacher .


5
Ważna obawa. Myślę, że strtotime () opiera się na twoich ustawieniach regionalnych.
Do

13
Uwaga: w większości krajów nieanglojęzycznych format dd-mm-yyyynie jest mm-dd-yyyy.
Camilo Martin,

1
@CamiloMartin Większość krajów, w których nie mówi się po angielsku, używa pierwszego podanego formatu, ale DB zazwyczaj przechowuje datę w YYYY-mm-dd. Konwersja dzieje się tylko w celu wyświetlenia użytkownikom
Danny22

@ DannyG właśnie przejrzał dokumenty i wydaje się, że masz rację, jeśli przez DB masz na myśli MySQL. Ale wydaje się to niedorzeczne ...
Camilo Martin

57


Ta metoda działa na obu systemach Windows i Unix i jest czas-zone świadomy, co jest prawdopodobnie to, co chcesz, jeśli pracujesz z datami .

Jeśli nie zależy Ci na strefie czasowej lub chcesz skorzystać ze strefy czasowej używanej przez serwer:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (To będzie się różnić w zależności od strefy czasowej serwera ...)


Jeśli chcesz określić, w której strefie czasowej, tutaj EST. (Tak samo jak w Nowym Jorku.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


Lub jeśli chcesz korzystać z UTC . (Taki sam jak „ GMT ”.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Niezależnie od tego zawsze dobrym punktem wyjścia jest zachowanie ścisłości podczas analizowania ciągów w ustrukturyzowanych danych. Może zaoszczędzić niewygodnego debugowania w przyszłości. Dlatego zalecam zawsze określać format daty.


Hej Falken, nie ma za co. Jednak prawdopodobnie lepiej jest określić, że to rozwiązanie dotyczy PHP 5.3+
Luca Fagioli,

43

Korzystanie z mktime :

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);

Tak zawsze robiłem. Rozbij go na - lub / lub. lub cokolwiek to jest oddzielone, to mktime.
Rich Bradshaw,

1
W podręczniku PHP znajduje się informacja na temat ostatniego parametru funkcji mktime: „Od wersji PHP 5.1.0 ten parametr stał się przestarzały. W związku z tym należy użyć nowych funkcji obsługi strefy czasowej”. Muszę jednak odkryć, o czym są nowe funkcje, o których mówią, ponieważ nie są z tym powiązane!
Wysoce nieregularny

Jest to o wiele lepsze niż strtotime()Z jakiegoś powodu strtotime()nie działa w określonych terminach, a zatem jest bardzo zawodne.
dspacejs

17

Za pomocą funkcji strtotime () możesz łatwo przekonwertować datę na znacznik czasu

<?php
// set default timezone
date_default_timezone_set('America/Los_Angeles');

//define date and time
$date = date("d M Y H:i:s");

// output
echo strtotime($date);
?> 

Więcej informacji: http://php.net/manual/en/function.strtotime.php

Narzędzie do konwersji online: http://freeonlinetools24.com/


Dla przyszłych czytelników - strtotime () był wypadkiem i nie należy zachęcać do jego używania. Jest niejednoznaczny, ponieważ próbuje zgadywać format daty. Nawet jeśli użyjesz go poprawnie, utrudni to zrozumienie i uzasadnienie kodu, a także ryzyko wprowadzenia zmian w bazie kodu, które wprowadzą błędy, ponieważ bez względu na to, co podasz strtotime (), spowoduje to, że najlepiej zgadywać. To przypuszczenie może być niepoprawne, ale nie otrzymasz żadnej wskazówki, że zgadło niepoprawnie. To jest karabin. Użyj go, jeśli chcesz, ale myślę, że początkujący użytkownicy mogą użyć zastrzeżenia. Uwaga: strzelba przed nami
umowa prof.

12

Oto bardzo proste i skuteczne rozwiązanie wykorzystujące funkcje spliti mtime:

$date="30/07/2010 13:24"; //Date example
list($day, $month, $year, $hour, $minute) = split('[/ :]', $date); 

//The variables should be arranged according to your date format and so the separators
$timestamp = mktime($hour, $minute, 0, $month, $day, $year);
echo date("r", $timestamp);

Dla mnie to działało jak urok.


Zauważ, że split () jest teraz przestarzałe, ale jeśli używasz starej wersji php, działa świetnie!
Hugo H,

6

Ponieważ funkcja strptime()nie działa w systemie Windows i strtotime()może zwrócić nieoczekiwane wyniki, zalecamy użycie date_parse_from_format():

$date = date_parse_from_format('d-m-Y', '22-09-2008');
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);

2
Uwaga: w przypadku strtotime (): separatorem jest ukośnik (/), wówczas zakłada się amerykański m / d / y; podczas gdy jeśli separatorem jest myślnik (-) lub kropka (.), wówczas przyjmuje się europejski format dmy. Więc myślę, że nie muszę używać strptime ()
secretlm

6

Jeśli chcesz się upewnić, czy data zostanie przeanalizowana w oczekiwany sposób, możesz użyć DateTime::createFromFormat():

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
if ($d === false) {
    die("Woah, that date doesn't look right!");
}
echo $d->format('Y-m-d'), PHP_EOL;
// prints 2008-09-22

W tym przypadku jest to oczywiste, ale np. 03-04-2008Może być 3 kwietnia lub 4 marca, w zależności od tego, skąd pochodzisz :)


1
DateTime::createFromFormat zwraca falsew przypadku błędu , nie null.
mpen

5

Jeśli znasz format, strptimeponieważ strtotimezgaduje format, co nie zawsze jest poprawne. Ponieważ strptimenie jest zaimplementowany w systemie Windows, istnieje funkcja niestandardowa

Pamiętaj, że wartość zwrotu tm_yearpochodzi z 1900 roku! i tm_monthwynosi 0-11

Przykład:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900)




3
function date_to_stamp( $date, $slash_time = true, $timezone = 'Europe/London', $expression = "#^\d{2}([^\d]*)\d{2}([^\d]*)\d{4}$#is" ) {
    $return = false;
    $_timezone = date_default_timezone_get();
    date_default_timezone_set( $timezone );
    if( preg_match( $expression, $date, $matches ) )
        $return = date( "Y-m-d " . ( $slash_time ? '00:00:00' : "h:i:s" ), strtotime( str_replace( array($matches[1], $matches[2]), '-', $date ) . ' ' . date("h:i:s") ) );
    date_default_timezone_set( $_timezone );
    return $return;
}

// expression may need changing in relation to timezone
echo date_to_stamp('19/03/1986', false) . '<br />';
echo date_to_stamp('19**03**1986', false) . '<br />';
echo date_to_stamp('19.03.1986') . '<br />';
echo date_to_stamp('19.03.1986', false, 'Asia/Aden') . '<br />';
echo date('Y-m-d h:i:s') . '<br />';

//1986-03-19 02:37:30
//1986-03-19 02:37:30
//1986-03-19 00:00:00
//1986-03-19 05:37:30
//2012-02-12 02:37:30

3
<?php echo date('U') ?>

Jeśli chcesz, umieść go w znaczniku czasu typu wejścia MySQL . Powyższe działa bardzo dobrze (tylko w PHP 5 lub nowszym):

<?php $timestamp_for_mysql = date('c') ?>

3

Oto jak bym to zrobił:

function dateToTimestamp($date, $format, $timezone='Europe/Belgrade')
{
    //returns an array containing day start and day end timestamps
    $old_timezone=date_timezone_get();
    date_default_timezone_set($timezone);
    $date=strptime($date,$format);
    $day_start=mktime(0,0,0,++$date['tm_mon'],++$date['tm_mday'],($date['tm_year']+1900));
    $day_end=$day_start+(60*60*24);
    date_default_timezone_set($old_timezone);
    return array('day_start'=>$day_start, 'day_end'=>$day_end);
}

$timestamps=dateToTimestamp('15.02.1991.', '%d.%m.%Y.', 'Europe/London');
$day_start=$timestamps['day_start'];

W ten sposób poinformujesz funkcję, jakiego formatu daty używasz, a nawet określisz strefę czasową.


0

Uważaj na czas / strefę, jeśli ustawiłeś, aby zapisywać daty w bazie danych, ponieważ dostałem problem podczas porównywania dat z mysql, które zostały przekonwertowane na timestampużyciestrtotime . musisz użyć dokładnie tego samego czasu / strefy przed konwersją daty na znacznik czasu, w przeciwnym razie strtotime () użyje domyślnej strefy czasowej serwera.

Zobacz ten przykład: https://3v4l.org/BRlmV

function getthistime($type, $modify = null) {
    $now = new DateTime(null, new DateTimeZone('Asia/Baghdad'));
    if($modify) {
        $now->modify($modify);
    }
    if(!isset($type) || $type == 'datetime') {
        return $now->format('Y-m-d H:i:s');
    }
    if($type == 'time') {
        return $now->format('H:i:s');
    }
    if($type == 'timestamp') {
        return $now->getTimestamp();
    }
}
function timestampfromdate($date) {
    return DateTime::createFromFormat('Y-m-d H:i:s', $date, new DateTimeZone('Asia/Baghdad'))->getTimestamp();
}

echo getthistime('timestamp')."--".
    timestampfromdate(getthistime('datetime'))."--".
    strtotime(getthistime('datetime'));

//getthistime('timestamp') == timestampfromdate(getthistime('datetime')) (true)
//getthistime('timestamp') == strtotime(getthistime('datetime')) (false)

-4

Jeśli chcesz przekonwertować datetime UTC ( 2016-02-14T12:24:48.321Z) na znacznik czasu, oto jak to zrobić:

function UTCToTimestamp($utc_datetime_str)
{
    preg_match_all('/(.+?)T(.+?)\.(.*?)Z/i', $utc_datetime_str, $matches_arr);
    $datetime_str = $matches_arr[1][0]." ".$matches_arr[2][0];

    return strtotime($datetime_str);
}

$my_utc_datetime_str = '2016-02-14T12:24:48.321Z';
$my_timestamp_str = UTCToTimestamp($my_utc_datetime_str);
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.