1

所以基本上,我目前正在从我的 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,那么一切都是标准的 PHP,除了echo timespan(). 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

正如你所看到的,我目前正在使用 CodeIgniter 函数来简化这一点——但如果有任何原生 PHP 函数可以做我想做的事情,那就太棒了。

谢谢你的帮助!

杰克

4

2 回答 2

6

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

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

Timeago 将使用classtimeago 和 ISO 8601 时间戳转换所有 abbr 元素title

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

变成这样的东西:

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

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

<?= date("c", $post_date) ?>

例子:

您在不到一分钟前打开了此页面。(这将每分钟更新一次。等待它。)

此页面上次修改时间为 11 天前。

瑞安出生于 31 年前。

于 2010-07-02T21:31:32.940 回答
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 天”之类的内容,则必须进行一些调整。

于 2010-07-02T21:39:55.473 回答