[Php] Strtotime () не работает с форматом dd / mm / YYYY


Answers

Вы можете анализировать даты из пользовательского формата (начиная с PHP 5.3) с помощью DateTime::createFromFormat

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(Помимо этого: The ! Используется для сброса не заданных значений в метку времени Unix, то есть время будет полночь.)

Если вы не хотите (или не можете) использовать PHP 5.3, то полный список доступных форматов даты и времени, который принимает strtotime, указан на странице руководства по форматам дат. На этой странице более подробно описывается то, что m/d/Y выводится по d/m/Y (но вы можете, как упоминалось в ответах здесь, использовать dmY , dmY или d\tm\tY ).

Раньше я также прибегал к быстрому str_replace упомянутому в другом ответе, а также самоанализу строки даты в другой формат, например

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);
Question

Мне очень нравится strtotime() , но руководство пользователя не дает полного описания поддерживаемых форматов дат. strtotime('dd/mm/YYYY') не работает, он работает только с форматом mm/dd/YYYY .

Если у меня есть дата в формате dd/mm/YYYY , как я могу преобразовать ее в YYYY-mm-dd ? Я могу сделать это, используя функцию explode() , но я думаю, что есть лучшие решения.




Это обходное решение проще и элегантнее, чем взрывается:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

Вам не обязательно знать, в какой формат вы введете дату, но если она идет с косой чертой, они заменяются полными остановками, и она рассматривается как европейская strtotime.




Это решение, которое я использую, даже если начальный ноль есть.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>



Я не нашел лучшего решения. Вы можете использовать explode() , preg_match_all() и т. Д.

У меня есть статическая вспомогательная функция, подобная этой

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

Вероятно, это лучшее название, но я использую ausStrToTime() потому что он работает с австралийскими датами (с которыми я часто сталкиваюсь, будучи австралиец). Лучшее имя, вероятно, будет стандартизованным именем, но я не уверен, что это такое.




Это хорошее решение многих проблем:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}



Получаете ли вы это значение из базы данных? Если да, рассмотрите форматирование его в базе данных (например, используйте date_format в mysql). Если нет, взломать значение может быть лучшим выбором, так как strtotime просто не оценивает значения dd / mm / yyyy.





Tags