需要重写日期显示功能

时间:2012-03-19 14:29:16

标签: php 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。昨天我有一位来自澳大利亚的用户指出,自从他走上一个完全不同的时区,实际上是前一天(与某个时间的输出相比)时,他没有做任何事情。

我决定改写我的功能来说:

  • 如果在一分钟之内>几秒钟前
  • 如果不到一小时> #minle前
  • 在1-2小时之间>一个多小时前
  • 2 - 24小时>一天前
  • 2-7天> #day ago
  • 7天 - 月> #周前
  • 1 - 2个月>一个多月
  • 之后我可以只显示日期

是否有任何您可能知道这样做的功能,如果不是,我将如何修改此功能?

感谢。

1 个答案:

答案 0 :(得分:2)

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来允许您轻松添加和删除行为中的项目/选项。