Как преобразовать дату в timestamp в PHP?

Как получить временную метку, например, 22-09-2008 ?

PHP strtotime() дает

 $timestamp = strtotime('22-09-2008'); 

Что работает с документами поддерживаемых дат и времени .

Существует также strptime() который ожидает ровно один формат:

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

Будьте осторожны с функциями, такими как strtotime() которые пытаются «угадать» то, что вы имеете в виду (это, конечно, не догадывается, правила здесь ).

Действительно, 22-09-2008 будет проанализирован 22 сентября 2008 года , поскольку это единственная разумная вещь.

Как будет анализироваться 08-09-2008? Вероятно, 09 августа 2008 года .

Как насчет 2008-09-50 ? Некоторые версии PHP анализируют это как 20 октября 2008 года .

Итак, если вы уверены, что ваш вход находится в формате DD-MM-YYYY , лучше использовать решение, предлагаемое @Armin Ronacher .

С API DateTime :

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

То же самое с процедурным API:

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

Если вышеуказанное не работает, потому что вы используете неподдерживаемый формат , вы можете использовать

 $date = DateTime::createFromFormat('!dm-Y', '22-09-2008'); echo $dateTime->format('U'); // or $date = date_parse_from_format('!dm-Y', '22-09-2008'); echo date_format($date, 'U'); 

Обратите внимание, что если вы не установите ! , временная часть будет установлена ​​на текущее время, которое отличается от первых четырех, которое будет использовать полночь, когда вы опустите время.

Еще одна альтернатива – использовать API IntlDateFormatter :

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

Если вы не работаете с локализованными строками даты, проще выбрать DateTime.

Использование mktime :

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

Если у вас PHP 5.3 или выше,

этот метод работает как в Windows, так и в Unix и знает о часовых поясах, что, вероятно, вам нужно, если вы серьезно относитесь к работе с датами.

Если вам не нужен часовой пояс или вы хотите использовать часовой пояс, который использует ваш сервер:

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008'); echo $d->getTimestamp(); 

1222093324 (Это будет отличаться в зависимости от вашего часового пояса сервера …)

Если вы хотите указать, в каком часовом поясе, здесь EST. (То же, что и Нью-Йорк.)

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008', new DateTimeZone('EST')); echo $d->getTimestamp(); 

1222093305

Или если вы хотите использовать UTC. (То же, что и «GMT».)

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008', new DateTimeZone('UTC')); echo $d->getTimestamp(); 

1222093289

Это очень простое и эффективное решение с использованием функций split и 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); 

Это работало как прелесть для меня.

Используя функцию strtotime (), вы можете легко преобразовать дату в метку времени

 <?php // set default timezone date_default_timezone_set('America/Los_Angeles'); //define date and time $date = date("d MYH:i:s"); // output echo strtotime($date); ?> 

Дополнительная информация: http://php.net/manual/en/function.strtotime.php

Инструмент онлайн-конвертации: http://freeonlinetools24.com/

Учитывая, что функция strptime() не работает для Windows, и strtotime() может возвращать неожиданные результаты, я рекомендую использовать date_parse_from_format() :

 $date = date_parse_from_format('dm-Y', '22-09-2008'); $timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']); 
 $time = '22-09-2008'; echo strtotime($time); 

Если вы хотите точно знать, будет ли синтаксическая обработка даты ожидаемой, вы можете использовать DateTime::createFromFormat() :

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

Это очевидно в этом случае, но, например, 03-04-2008 может быть 3 апреля или 4 марта в зависимости от того, откуда вы пришли 🙂

Если вы знаете, что формат использует strptime потому что strtotime делает предположение для формата, что может не всегда быть правильным. Поскольку strptime не реализована в Windows, есть пользовательская функция

Помните, что returnvalue tm_year – с 1900 года! и tm_month равно 0-11

Пример:

 $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')); ?> 

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

 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( "Ymd " . ( $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('Ymd 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 
 <?php echo date('U') ?> 

Если вы хотите, поместите его в временную метку ввода типа MySQL . Вышеописанное работает очень хорошо (только на PHP 5 или новее):

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

Вот как я это сделаю:

 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']; 

Таким образом, вы позволяете функции знать, какой формат даты вы используете, и даже указать часовой пояс.

Пожалуйста, будьте осторожны в отношении времени / зоны, если вы установите для сохранения дат в базе данных, поскольку у меня возникла проблема, когда я сравнивал даты с mysql, которые были преобразованы в timestamp с использованием strtotime . вы должны использовать точно такое же время / зону перед преобразованием даты в метку времени, иначе strtotime () будет использовать часовой пояс сервера по умолчанию.

См. Этот пример: 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('Ymd H:i:s'); } if($type == 'time') { return $now->format('H:i:s'); } if($type == 'timestamp') { return $now->getTimestamp(); } } function timestampfromdate($date) { return DateTime::createFromFormat('Ymd 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) 

Если вы хотите преобразовать 2016-02-14T12:24:48.321Z время UTC ( 2016-02-14T12:24:48.321Z ) в метку времени, вот как вы это сделаете:

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