Ответы:
Этот метод работает на обеих ОС 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
Несмотря на это, всегда хорошая отправная точка для строгости при разборе строк в структурированных данных. Это может сохранить неловкую отладку в будущем. Поэтому я рекомендую всегда указывать формат даты.
Существует также 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);
date_parse_from_formatвместо strptime.
strptimeне реализовано на платформах Windows.
С 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.
! временная метка « Моя дата» менялась при каждом обновлении и сводила меня с ума - потому что DateTime старательно добавлял текущее время, не спрашивая и не сообщая. Хмм.
Будьте осторожны с такими функциями strtotime(), попытайтесь «угадать», что вы имеете в виду (конечно, это не значит, что правила здесь ).
Действительно 22-09-2008будет разобран как 22 сентября 2008 года , так как это единственно разумная вещь.
Как будет 08-09-2008разбираться? Вероятно, 09 августа 2008 года .
Как насчет 2008-09-50? Некоторые версии PHP обрабатывают это как 20 октября 2008 года .
Итак, если вы уверены, что ваш ввод в DD-MM-YYYYформате, лучше использовать решение, предлагаемое @Armin Ronacher .
dd-mm-yyyyнет mm-dd-yyyy.
YYYY-mm-dd. Конверсия происходит только для отображения пользователям
Этот метод работает на обеих ОС 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
Несмотря на это, всегда хорошая отправная точка для строгости при разборе строк в структурированных данных. Это может сохранить неловкую отладку в будущем. Поэтому я рекомендую всегда указывать формат даты.
Использование mktime :
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
strtotime()какой-то причине strtotime()не работает в определенные даты, и поэтому очень ненадежно.
Используя функцию 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/
Вот очень простое и эффективное решение , используя 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);
Это сработало как обаяние для меня.
Учитывая, что эта функция 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']);
Если вы хотите точно знать, разбирается ли дата во что-то, что вы ожидаете, вы можете использовать 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 марта в зависимости от того, откуда вы пришли :)
Если вы знаете формат использования 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)
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
$time = '22-09-2008';
echo strtotime($time);
Используйте функцию PHP strtotime()
echo strtotime('2019/06/06');
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
Вот как я это сделаю:
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'];
Таким образом, вы сообщаете функции, какой формат даты вы используете, и даже указываете часовой пояс.
Пожалуйста, будьте осторожны с часовым поясом, если вы установите его для сохранения дат в базе данных, так как у меня возникла проблема, когда я сравнивал даты из 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)
Если вы хотите преобразовать дату и время 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);