Odpowiedzi:
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.
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);
date_parse_from_formatzamiast strptime.
strptimenie jest zaimplementowany na platformach Windows.
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.
! 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.
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 .
dd-mm-yyyynie jest mm-dd-yyyy.
YYYY-mm-dd. Konwersja dzieje się tylko w celu wyświetlenia użytkownikom
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.
Korzystanie z mktime :
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
strtotime()Z jakiegoś powodu strtotime()nie działa w określonych terminach, a zatem jest bardzo zawodne.
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/
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.
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']);
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 :)
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)
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
$time = '22-09-2008';
echo strtotime($time);
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
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ą.
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)
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);