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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
363
0
911 643
19

Ответы 19

Используя mktime:

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

Я всегда так поступал. Взорвать его на - или / или. или что там отдельно, тогда mktime.

Rich Bradshaw 22.09.2008 21:25

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

Highly Irregular 11.01.2012 05:00

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

dspacejs 16.05.2015 09:21


Этот метод работает в обе 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(This will differ depending on your server time zone...)


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


Или, если вы хотите использовать универсальное глобальное время. (То же, что и «время по Гринвичу».)

$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


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

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

Till 22.09.2008 12:49

Как так получилось, что вы еще не получили должного ответа на этот вопрос ?!

Mark Tomlin 13.06.2010 17:09

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

RonLugge 05.03.2013 09:40

@ think123 Этот ответ действительно работает для меня. Почему вы говорите, что не работает?

Devner 22.04.2013 02:11

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

Lucas 22.04.2013 04:05

Помните, что strtotime('2012') может привести к отметке сегодняшнего дня и времени 20:12.

Timo Huovinen 31.07.2013 15:51

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

Luca Fagioli 13.04.2015 23:22

ваши +1 баллы не найдены в stackoverflow :)

AzizAhmad 17.10.2015 17:35

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

e2-e4 23.07.2020 18:05

@ e2-e4 Это еще не все. Профессор Фалькен обновил этот ответ 13 мая. 13 мая у меня день рождения. Совпадение? Я так не думаю.

Luca Fagioli 23.07.2020 22:10

Также существует 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);

это должно быть tm_mon вместо tm_month и tm_mday вместо tm_day

amarillion 15.05.2009 15:32

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

understack 29.05.2010 16:03

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

Erwin Wessels 25.06.2013 13:56

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

Randell 07.05.2015 10:21

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

Prof. Falken 13.05.2020 17:44

Кроме того, начиная с PHP 5.3 рекомендуется использовать php.net/manual/en/function.date-parse-from-format.php.

Prof. Falken 13.05.2020 18:07

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

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

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

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

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

Правомерное беспокойство. Я предполагаю, что strtotime () зависит от вашего языка.

Till 23.09.2008 13:17

Примечание. В большинстве неанглоязычных стран используется формат dd-mm-yyyy, а не mm-dd-yyyy.

Camilo Martin 12.12.2010 01:49

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

Danny22 15.09.2014 19:24

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

Camilo Martin 15.09.2014 21:51

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

Помните, что возвратное значение 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)

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

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

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

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

Hugo H 19.12.2016 15:37

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

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

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

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

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

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

Till 11.01.2012 20:47

Арггг. ! Не забывайте !. Моя временная метка на основе даты менялась при каждом обновлении и сводила меня с ума, потому что DateTime помогал добавлять текущее время, не спрашивая и не говоря об этом. Grrr.

user672739 08.06.2018 11:40

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

Prof. Falken 13.05.2020 17:57

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

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

Примечание: с strtotime (): разделителем является косая черта (/), тогда предполагается американский m / d / y; тогда как если разделителем является тире (-) или точка (.), то предполагается европейский формат d-m-y. Поэтому я думаю, что не нужно использовать strptime ()

secretlm 21.06.2013 10:09

<?php echo date('U') ?>

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

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

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

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

mpen 24.12.2014 03:09


Этот метод работает в обе 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(This will differ depending on your server time zone...)


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


Или, если вы хотите использовать универсальное глобальное время. (То же, что и «время по Гринвичу».)

$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 Fagioli 13.04.2015 16:46

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

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

$time = '22-09-2008';
echo strtotime($time);

Используя функцию 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 (), он сделает лучше всего угадывать. Это предположение может быть неверным, но вы не получите никаких указаний на то, что оно было угадано неправильно. Это ножное ружье. Используйте его, если хотите, но я думаю, начинающие пользователи могут сделать оговорку. Осторожно: впереди пушка

Prof. Falken 13.05.2020 17:41

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

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

Используйте функцию PHP strtotime()

echo strtotime('2019/06/06');

date - форматировать местное время / дату

он сказал, от даты к отметке времени, а не к дате

SamYan 24.02.2019 23:11

Проверьте это сейчас.

Gurpreet Singh 28.02.2019 13:07

Другие вопросы по теме