strtotime вместо этой очень длинной функции? - PullRequest
0 голосов
/ 17 ноября 2011

Я копаюсь в коде, который этот профессиональный программист написал для меня на сайте событий, и я обнаружил, что эта функция кажется очень запутанной, поскольку похоже, что 1 строка кода с "strtotime" сделает то же самое.

Это потому, что мы хотели использовать формат "Jan 2nd" с двумя буквами после дня месяца?

function convert_date_to_web($date) {
    if (empty($date) || $date == "0000-00-00") return $date;
    switch ($date[5].$date[6]) {
        case '01':
        $month = 'Jan';
        break;
        case '02':
        $month = 'Feb';
        break;
        case '03':
        $month = 'Mar';
        break;
        case '04':
        $month = 'Apr';
        break;
        case '05':
        $month = 'May';
        break;
        case '06':
        $month = 'Jun';
        break;
        case '07':
        $month = 'Jul';
        break;
        case '08':
        $month = 'Aug';
        break;
        case '09':
        $month = 'Sep';
        break;
        case '10':
        $month = 'Oct';
        break;
        case '11':
        $month = 'Nov';
        break;
        case '12':
        $month = 'Dec';
    }
    if($date[9] == "1") {
        $day = $date[9]."st";
    }
    else if ($date[9] == "2") {
        $day = $date[9]."nd";
    }
    else if ($date[9] == "3") {
        $day = $date[9]."rd";
    }
    else {
        $day = $date[9]."th";
    }
    if($date[8] != "0") {
        $day = $date[8].$day;
    }
    $date = $month." ".$day.", ".$date[0].$date[1].$date[2].$date[3];
    return $date;
}

И моя версия

$timestamp = strtotime($event->start_date);
$start_date = date("M d, Y", $timestamp); 

Ответы [ 4 ]

2 голосов
/ 17 ноября 2011

Вот точная копия оригинальной функции.Я использовал две версии, первая использует strtotime, вторая использует explode, чтобы избежать использования strtotime.

$date = '2011-10-01';
$date_format = 'M jS, Y'; // Three letter month, day name w/o leading zero, day suffix, year
echo date( $date_format, strtotime( $date)) . "\n";

$date_pieces = explode( '-', $date);
echo date( $date_format, mktime( 0, 0, 0, $date_pieces[1], $date_pieces[2], $date_pieces[0]));

Demo

0 голосов
/ 17 ноября 2011

Причина, по которой я предпочитаю такие решения explode () вместо strtotime (), заключается в том, что они дают детерминированные, переносимые результаты, которые менее удивительны , в то время как strtotime () совершает некоторую сложную магию.

0 голосов
/ 17 ноября 2011

Как и во всех программах, существует несколько способов сделать что-то.Опыт учит программиста действовать определенным образом.Из этой функции видно, что для преобразования выходного формата по умолчанию для mysql даты в версию, которая преобразует месяц в строку.Это выглядит хорошо для меня

0 голосов
/ 17 ноября 2011

Да.Я думаю, что именно в этом причина этой длинной функции.Это добавить в "st", "nd", "rd" и "th".

Ваш код этого не делает.Может быть, вы можете попробовать это так?(Требуется отладка, потому что я никогда не проверял его на реальном php)

$timestamp = strtotime($event->start_date);
$start_date = date("M d", $timestamp);
$lastNum = substr($start_date, -1)
switch($lastNum) {
  case "0":
    break;
  case "1":
    $start_date .= "st"; break;
  case "2":
    $start_date .= "nd"; break;
  case "3":
    $start_date .= "rd"; break;
  default:
    $start_date .= "th"; break;
}
$start_date .= date(", Y", $timestamp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...