Як конвертувати дату в мітку часу в 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
amarillion

68
Обережно, функція strptime недоступна в Windows.
understack

12
Ті, хто в Windows та PHP 5.3.0+, date_parse_from_formatзамість того, щоб їх використовувати strptime.
Ервін Весселс

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

Оскільки це відповідь з високим голосом, чи можете ви відредагувати її до відповіді, яка працює як на PHP для Windows, так і на unixen? І IMHO в ідеалі має згадувати часові пояси.
Контракт професора Фолкена було порушено

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
Я рекомендую це над своєю відповіддю сьогодні.
До

Арггг. ! Не забувайте, що ! часова мітка "Моя дата" змінювалася з кожним оновленням і зводила мене з розуму - адже DateTime з користю додав поточний час, не запитуючи і не повідомляючи. Grrr

Хочу додати, що я рекомендую проти неоднозначного розбору дат і що формат дати повинен бути наданий явно при розборі рядків дати.
Контракт професора Фолкена було порушено

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+
Лука

43

Використання mktime :

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

Це я завжди робив. Вибухнути його на - або / або. або що б там не було відокремлено, то mktime.
Річ Бредшоу

1
У посібнику PHP є зауваження щодо останнього параметра функції mktime: "Станом на 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_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)




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.