





Используя mktime:
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
В руководстве по PHP есть примечание к последнему параметру функции mktime: «Начиная с PHP 5.1.0, этот параметр устарел. В результате вместо него следует использовать новые функции обработки часового пояса». Я еще не узнал, о каких новых функциях они говорят, поскольку они не связаны с этим!
Это намного лучше, чем strtotime(). По какой-то причине strtotime() не работает в определенные даты и поэтому очень ненадежен.
Этот метод работает в обе 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
Тем не менее, всегда хорошая отправная точка - быть строгим при синтаксическом анализе строк в структурированные данные. Это может спасти от неудобной отладки в будущем. Поэтому я рекомендую всегда указывать формат даты.
Элегантный. Я забыл про это!
Как так получилось, что вы еще не получили должного ответа на этот вопрос ?!
Совершенно верный ответ, но я удивлен, что ответ Армина Ронахера не совпал с ним в положительных голосах - двусмысленность ВСЕГДА плохо.
@ think123 Этот ответ действительно работает для меня. Почему вы говорите, что не работает?
@Devner Ну, похоже, на моем сервере этот формат не поддерживается. Может, с твоим все по-другому.
Помните, что strtotime('2012') может привести к отметке сегодняшнего дня и времени 20:12.
Это решение может привести к неожиданному поведению. Те, кто использует PHP 5.3+, должны использовать Ответ профессора Фалькена, в котором у каждого есть полный контроль над форматом даты.
ваши +1 баллы не найдены в stackoverflow :)
@LucaFagioli Похоже, профессор Фалькен, отчаявшись увидеть этот ответ с таким количеством голосов, обновил его и включил в него свою собственную науку.
@ e2-e4 Это еще не все. Профессор Фалькен обновил этот ответ 13 мая. 13 мая у меня день рождения. Совпадение? Я так не думаю.
Также существует 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
Остерегайтесь, функция strptime недоступна в Windows.
Те, кто работает в Windows и PHP 5.3.0+, рассмотрите возможность использования date_parse_from_format вместо strptime.
... потому что strptime не реализован на платформах Windows.
Поскольку за этот ответ проголосовало большое количество голосов, не могли бы вы отредактировать его до ответа, который работает как на PHP для Windows, так и на unixen? И ИМХО в идеале следует упомянуть часовые пояса.
Кроме того, начиная с PHP 5.3 рекомендуется использовать php.net/manual/en/function.date-parse-from-format.php.
Будьте осторожны с такими функциями, как strtotime(), которые пытаются «угадать», что вы имеете в виду (конечно, не угадывает правила здесь).
Действительно, 22-09-2008 будет анализироваться как 22 сентября 2008 г., поскольку это единственно разумная вещь.
Как будет разбираться 08-09-2008? Наверное 09 августа 2008 г..
Что насчет 2008-09-50? Некоторые версии PHP анализируют это как 20 октября 2008 г..
Итак, если вы уверены, что ваш ввод находится в формате DD-MM-YYYY, лучше использовать решение, предлагаемое @Armin Ronacher.
Правомерное беспокойство. Я предполагаю, что strtotime () зависит от вашего языка.
Примечание. В большинстве неанглоязычных стран используется формат dd-mm-yyyy, а не mm-dd-yyyy.
@CamiloMartin Большинство неанглоязычных стран используют первый указанный вами формат, но БД обычно хранит дату в YYYY-mm-dd. Преобразование происходит только для отображения пользователям
@DannyG только что посмотрел на документы, и кажется, что вы правы, если под DB вы имеете в виду MySQL. Но это действительно кажется смешным ...
Если вы знаете формат, используйте 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, она отлично работает!
$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.
Я бы порекомендовал это вместо своего ответа в настоящее время.
Арггг. ! Не забывайте !. Моя временная метка на основе даты менялась при каждом обновлении и сводила меня с ума, потому что DateTime помогал добавлять текущее время, не спрашивая и не говоря об этом. Grrr.
Я хочу добавить, что я рекомендую избегать неоднозначного синтаксического анализа даты и что формат даты должен быть указан явно при синтаксическом анализе строк даты.
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 ()
<?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.
Этот метод работает в обе 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+.
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
$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 (), он сделает лучше всего угадывать. Это предположение может быть неверным, но вы не получите никаких указаний на то, что оно было угадано неправильно. Это ножное ружье. Используйте его, если хотите, но я думаю, начинающие пользователи могут сделать оговорку. Осторожно: впереди пушка
Если вы хотите преобразовать дату и время в формате 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 - форматировать местное время / дату
он сказал, от даты к отметке времени, а не к дате
Проверьте это сейчас.
Я всегда так поступал. Взорвать его на - или / или. или что там отдельно, тогда mktime.