Нужно переписать функцию для отображения даты - PullRequest
1 голос
/ 19 марта 2012

У меня есть следующая функция, которую я написал пару лет назад.Он берет datetime из моей БД и отображает его в более удобном формате.

function formatTime($dateTime){
// show time only if posted today
if (date('Ymd') == date('Ymd', strtotime($dateTime))) {
    $dt = date('g:i a', strtotime($dateTime));
} else {
    // if not the same year show YEAR 
    if (date('Y') == date('Y', strtotime($dateTime))) {
        $dt = date('M j', strtotime($dateTime));
    } else {
        $dt = date('M j, Y', strtotime($dateTime));
    }
}

return $dt;
}

Я использую время сервера, которое для меня является CST.Вчера у меня был пользователь из Австралии, который указывал, что для него это ничего не дало, так как он находился в совершенно другом часовом поясе, фактически на день вперед (по сравнению с моим результатом в определенное время:).

Я решил переписать свою функцию так:

  • если меньше минуты> секунд назад
  • если меньше часа> # минут назад
  • между 1 -2 часа> более часа назад
  • 2 - 24 часа> день назад
  • 2 - 7 дней> # дней назад
  • 7 дней - месяц> # недели назад
  • 1 - 2 месяца> более месяца
  • после этого я могу просто показать дату

Существуют ли какие-либо функции, о которых вам, возможно, известно, если это не делатьКак бы я изменил это?

Спасибо.

1 Ответ

2 голосов
/ 19 марта 2012
function formatTime ($dateTime) {

  // A Unix timestamp will definitely be required
  $dateTimeInt = strtotime($dateTime);

  // First we need to get the number of seconds ago this was
  $secondsAgo = time() - $dateTimeInt;

  // Now we decide what to do with it
  switch (TRUE) {

    case $secondsAgo < 60: // Less than a minute
      return "$secondsAgo seconds ago";

    case $secondsAgo < 3600: // Less than an hour
      return floor($secondsAgo / 60)." minutes ago";

    case $secondsAgo < 7200: // Less than 2 hours
      return "over an hour ago";

    case $secondsAgo < 86400: // Less than 1 day
      return "1 day ago"; // This makes no sense, but it is what you have asked for...

    case $secondsAgo < (86400 * 7): // Less than 1 week
      return floor($secondsAgo / 86400)." days ago";

    case $secondsAgo < (86400 * 28): // Less than 1 month - for the sake of argument let's call a month 28 days
      return floor($secondsAgo / (86400 * 7))." weeks ago";

    case $secondsAgo < (86400 * 56): // Less than 2 months
      return "over a month ago";

    default:
      return date('M j, Y', $dateTimeInt);

  }

}

Это ни в коем случае не безупречно, тем более что одно из ваших требований не имеет смысла (см. Комментарии), но, надеюсь, оно должно дать вам толчок в правильном направлении и проиллюстрировать, как вы можете использовать switch, чтобы позволить вам легко добавлять и удалять элементы / параметры из поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...