Как получить временную метку, например, 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')); ?>
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);