Преобразование даты в PHP из формата ггггммдд
Вопрос
У меня есть даты в следующем формате (ггггммдд, 18751104, 19140722)...какой самый простой способ преобразовать его в date()....или лучше всего использовать mktime() и подстроки...?
Решение
Использовать strtotime()
преобразовать строку, содержащую дату, в Временная метка Unix:
<?php
// both lines output 813470400
echo strtotime("19951012"), "\n",
strtotime("12 October 1995");
?>
Вы можете передать результат в качестве второго параметра в date()
чтобы переформатировать дату самостоятельно:
<?php
// prints 1995 Oct 12
echo date("Y M d", strtotime("19951012"));
?>
Примечание
strtotime()
потерпит неудачу с датами до эпохи Unix в начале 1970 года.
В качестве альтернативы, которая будет работать с датами до 1970 года:
<?php
// Returns the year as an offset since 1900, negative for years before
$parts = strptime("18951012", "%Y%m%d");
$year = $parts['tm_year'] + 1900; // 1895
$day = $parts['tm_mday']; // 12
$month = $parts['tm_mon']; // 10
?>
Другие советы
Лично я бы просто использовал substr(), потому что в любом случае это, вероятно, самый простой способ сделать это.
Но вот функция, которая принимает дату, формат которой можно указать.Он возвращает ассоциативный массив, поэтому вы можете сделать, например (непроверено):
$parsed_date = date_parse_from_format('Ymd', $date);
$timestamp = mktime($parsed_date['year'], $parsed_date['month'], $parsed_date['day']);
http://uk.php.net/manual/en/function.date-parse-from-format.php
Хотя должен сказать, я не считаю это проще и эффективнее, чем просто:
mktime(substr($date, 0, 4), substr($date, 4, 2), substr($date, 6, 2));
посмотри на strptime
Что ж, спасибо за все ответы, но проблема 1900 года, кажется, беспокоит каждый ответ, который я получаю.Вот копия функции, которую я использую, если кто-нибудь найдет ее полезной в будущем.
public static function nice_date($d){
$ms = array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);
$the_return = '';
$the_month = abs(substr($d,4,2));
if ($the_month != 0) {
$the_return .= $ms[$the_month-1];
}
$the_day = abs(substr($d,6,2));
if ($the_day != 0){
$the_return .= ' '.$the_day;
}
$the_year = substr($d,0,4);
if ($the_year != 0){
if ($the_return != '') {
$the_return .= ', ';
}
$the_return .= $the_year;
}
return $the_return;
}
(PHP 5 >= 5.3.0, PHP 7):
Вы можете получить экземпляр DateTime с помощью:
$dateTime = \DateTime::createFromFormat('Ymd|', '18951012');
и преобразуем его в метку времени:
$timestamp = $dateTime->getTimestamp();
// -> -2342217600