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

276

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

Теги:
timestamp
date

18 ответов

490

PHP strtotime() дает

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

Что работает с Поддерживаемые форматы даты и времени Docs.

  • 2
    Элегантный. Я забыл про это!
  • 51
    Как получилось, что вы еще не получили этот ответ?
Показать ещё 8 комментариев
165

Существует также 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);
  • 4
    это должно быть tm_mon вместо tm_month и tm_mday вместо tm_day
  • 67
    Осторожно, функция strptime недоступна в Windows.
Показать ещё 3 комментария
114

С DateTime API:

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

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

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

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

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

  • 15
    Я рекомендовал бы это по моему ответу в настоящее время.
  • 2
    Это должен быть принят ответ.
Показать ещё 1 комментарий
111

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

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

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

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

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

  • 5
    Действительная забота. Я думаю, strtotime () зависит от вашей локали.
  • 13
    Примечание: в большинстве не говорящих по-английски стран формат dd-mm-yyyy , а не mm-dd-yyyy .
Показать ещё 3 комментария
41

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

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
  • 0
    Это то, что я всегда делал. Взрывайте это на - или / или. или что бы там ни было, тогда mktime.
  • 1
    В последнем параметре функции mktime в руководстве по PHP есть примечание: «Начиная с PHP 5.1.0, этот параметр устарел. В результате вместо этого следует использовать новые функции обработки часовых поясов». Мне еще предстоит узнать, о каких новых функциях они говорят, поскольку они не связаны с этим!
Показать ещё 2 комментария
35


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

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

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

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

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


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

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

1222093305


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

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

1222093289


  • 0
    Эй, Фалькен, пожалуйста. Однако, вероятно, лучше указать, что это решение применимо к PHP 5.3+.
13

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

Для меня это работало как прелесть.

  • 0
    Обратите внимание, что split () теперь устарела, но если вы используете ol php версию, она отлично работает!
12

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

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

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

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

7

Учитывая, что функция strptime() не работает для Windows и strtotime() может возвращать неожиданные результаты, я рекомендую использовать 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
    Примечание: с помощью strtotime (): разделитель - это косая черта (/), тогда предполагается американский m / d / y; тогда как если разделителем является тире (-) или точка (.), то предполагается европейский формат dmy. Так что я думаю, что не нужно использовать strptime ()
6
$time = '22-09-2008';
echo strtotime($time);
6

Если вы хотите точно знать, будет ли синтаксическая обработка даты в ожидаемом вами случае, вы можете использовать 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

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

5
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>

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

5

Если вы знаете формат, используйте 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)
4
<?php echo date('U') ?>

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

<?php $timestamp_for_mysql = date('c') ?>
4
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
4

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

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

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

1

Пожалуйста, будьте осторожны с временем/зоной, если вы установите для сохранения дат в базе данных, поскольку у меня возникла проблема, когда я сравнивал даты с 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('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)
-3

Если вы хотите преобразовать дату и время 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню