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


Ответы:


612


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

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

$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 (Это зависит от часового пояса вашего сервера ...)


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

$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


Или, если вы хотите использовать UTC . (То же, что « 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


Несмотря на это, всегда хорошая отправная точка для строгости при разборе строк в структурированных данных. Это может сохранить неловкую отладку в будущем. Поэтому я рекомендую всегда указывать формат даты.


2
Элегантный. Я забыл про это!
до

53
Как получилось, что вы еще не получили этот ответ?
Марк Томлин

4
Полностью верный ответ, но я удивлен, что ответ Армина Ронахера не нашел совпадения в ответах - двусмысленность ВСЕГДА плоха.
RonLugge

1
@ Devner Ну, похоже, на моем сервере этот формат не поддерживается. Может, у тебя все по другому.
Лукас

1
Такое решение может привести к неожиданному поведению. Те, кто использует PHP 5.3+, должны принять ответ профессора Фалькена , в котором каждый имеет полный контроль над форматом даты.
Лука Фагиоли

185

Существует также 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
Амариллион

68
Осторожно, функция strptime недоступна в Windows.
Понять

12
Те, на Windows и PHP 5.3.0+, рассмотрите возможность использования date_parse_from_formatвместо strptime.
Эрвин Уэсселс

1
... потому что strptimeне реализовано на платформах Windows.
Рэнделл

Так как это ответ с высоким рейтингом, рассмотрите возможность его редактирования в ответ, который работает как на PHP для Windows, так и на unixen? И ИМХО в идеале стоит упомянуть часовые пояса.
Профессор Фалькен нарушил договор

126

С DateTimeAPI :

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

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

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

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

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


15
Я рекомендовал бы это по моему ответу в настоящее время.
до

Arggg. ! Не забывайте, что ! временная метка « Моя дата» менялась при каждом обновлении и сводила меня с ума - потому что DateTime старательно добавлял текущее время, не спрашивая и не сообщая. Хмм.

Я хочу добавить, что я рекомендую против неоднозначного разбора даты, и что формат даты должен быть задан явно при разборе строк даты.
Профессор Фалькен нарушил договор

114

Будьте осторожны с такими функциями 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.
Камило Мартин

1
@CamiloMartin Большинство не говорящих по-английски стран используют первый указанный вами формат, но БД обычно хранят дату в YYYY-mm-dd. Конверсия происходит только для отображения пользователям
Danny22

@DannyG только что посмотрел на документы, и кажется, что вы правы, если под БД вы подразумеваете MySQL. Но это кажется смешным ...
Камило Мартин,

57


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

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

$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 (Это зависит от часового пояса вашего сервера ...)


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

$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


Или, если вы хотите использовать UTC . (То же, что « 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


Несмотря на это, всегда хорошая отправная точка для строгости при разборе строк в структурированных данных. Это может сохранить неловкую отладку в будущем. Поэтому я рекомендую всегда указывать формат даты.


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

43

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

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

Это то, что я всегда делал. Взорвать его на - или / или. или что бы это ни было разделено, тогда mktime.
Рич Брэдшоу

1
В последнем параметре функции mktime в руководстве по PHP есть примечание: «Начиная с PHP 5.1.0, этот параметр устарел. В результате вместо этого следует использовать новые функции обработки часовых поясов». Мне еще предстоит узнать, о каких новых функциях они говорят, поскольку они не связаны с этим!
Сильно нерегулярный

Это намного лучше, чем по strtotime()какой-то причине strtotime()не работает в определенные даты, и поэтому очень ненадежно.
dspacejs

17

Используя функцию 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/


Для будущих читателей strtotime () был несчастным случаем, и его использование не должно поощряться. Это неоднозначно, потому что он пытается угадать в формате даты. Даже если вы используете его правильно, это усложняет понимание и анализ вашего кода, и вы рискуете внести изменения в вашу кодовую базу, что приведет к ошибкам, потому что независимо от того, что вы дадите strtotime (), он сделает лучше угадать. Это предположение может быть неверным, но вы не получите никаких признаков того, что оно угадано неправильно. Это пулемет. Используйте его, если хотите, но начинающие пользователи могут использовать предостережение, я думаю. Осторожно: впереди легкое оружие
контракт профессора Фалькена нарушен

12

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

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


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

6

Учитывая, что эта функция 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 ()
secretlm

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 марта в зависимости от того, откуда вы пришли :)


1
DateTime::createFromFormat возвращается falseпо ошибке , нет null.
Mpen

5

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

Помните, что возвращаемое значение tm_yearс 1900 года! и tm_month0-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)




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

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

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

3

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

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

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


0

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

-4

Если вы хотите преобразовать дату и время 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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.