使PHP / MySQL时间戳看起来更具吸引力

时间:2010-07-02 21:27:13

标签: php mysql timestamp date-formatting

基本上,我正在从我的MySQL数据库中选择一个时间戳。在数据库中,时间戳如下所示:

2010-06-30 12:36:08

显然对于一个webapp来说,这对用户来说并不是很有吸引力。因此,使用一些CodeIgniter函数,我让它看起来更好一些。

<h4 class="timestamp">
    <?php // Quickly calculate the timespan
    $post_date = mysql_to_unix($row->date);
    $now = time();
    echo timespan($post_date, $now);?> ago
</h4>

如果你不做CodeIgniter,除了echo timespan()之外,一切都是标准的PHP。 CodeIgniter只是将它称为“英语”时间跨度。因此,示例输出将是:

2 Months, 4 Weeks, 5 Hours, 20 Minutes ago

这一切都很好,但是,我想让它看起来更好......有太多的逗号,而且它太长了(我知道,我很挑剔......)。我喜欢的是:

  1. 如果时间跨度不到一天,则输出应为7 hours, 33 minutes ago
  2. 如果时间跨度不到一周,则输出应为4 days ago
  3. 如果时间跨度不到一个月,则输出应为2 weeks, 6 days ago
  4. 如果时间跨度超过一个月,则输出应为4 months ago
  5. 在最长时间超过一年的情况下,输出应为Over a year ago
  6. 正如您所看到的,我目前正在使用CodeIgniter函数来简化此操作 - 但如果有任何本机PHP函数可以执行我想要的操作,那就太棒了。

    感谢您的帮助!

    杰克

2 个答案:

答案 0 :(得分:6)

最好在表示层的客户端完成。这是一个JS解决方案:

Timeago是一个jQuery插件,可以轻松支持自动更新模糊时间戳(例如“4分钟前”或“约1天前”)。

Timeago将使用class的timeago和{8}中的ISO 8601时间戳转换所有abbr元素:

title

这样的事情:

<abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>

要将日期转换为ISO 8601格式,您可以执行以下操作:

<abbr class="timeago" title="July 17, 2008">about a year ago</abbr>

示例:

  

你打开这个页面不到一个   一分钟前。 (这会更新每一个   分钟。等等。)

     

此页面最后修改了11天   前。

     

Ryan出生于31年前。

答案 1 :(得分:1)

$ts = new DateTime();
$ts->setTimestamp($my_timestamp);
$cur = new DateTime();
$difference = $cur->diff($ts);
if ($difference->format("%a") == 0)
    $out = $difference->format("%h hours %i minutes");
elseif ($difference->format("%a") < 7)
    $out = $difference->format("%a days");
elseif ($difference->format("%m") == 0) {
    $days = $difference->format("%a");
    $out = sprintf("%d weeks %d days", floor($days / 7),
        $days % 7);
}
elseif ($difference->format("%y") == 0)
    $out = $difference->format("%m months");
else
    $out = "over a year";

如果你不想要“1天”之类的东西,你必须做一些调整。