【问题标题】:Convert datetime into time ago [closed]将日期时间转换为时间前[关闭]
【发布时间】:2013-09-17 18:43:02
【问题描述】:

我需要将 DateTime 转换为年、月、日、小时、分钟、秒前,就像 5 周前或 1 年前或 1 个月前的雅虎问题一样,我的日期保存在数据库中,如下所示:@ 987654322@.

现在我想在 PHP 中显示年、月、日、小时、分钟和秒,例如:how much year, how many months , days, hours, minutes, seconds 之前,但只需要一个时间单位显示,例如年、天、小时、分钟或秒。

我已经对此进行了搜索,但不明白我该如何做到这一点,我知道 Stack Overflow 上的这个主题有很多问题,也许它是重复的,但我无法解决我的问题。

提前致谢。

【问题讨论】:

  • 您不能将日期转换为时间段。您需要 两个 日期才能正常工作。
  • 你想要那个时候和现在的区别,我猜? php.net/manual/en/datetime.diff.php
  • 不,我不想要差异
  • @ali 那你打算怎么把“2011”变成“2年”呢?
  • 这只是一个例子:我只想把这个日期时间2011-11-30 05:25:50 转换成正确的格式

标签: php


【解决方案1】:

假设你的意思是相对于现在(如果你不是,请澄清你的问题),你可以使用这个:

$then = new DateTime('2011-11-30 05:25:50');
$now = new DateTime();
$delta = $now->diff($then);

$quantities = array(
    'year' => $delta->y,
    'month' => $delta->m,
    'day' => $delta->d,
    'hour' => $delta->h,
    'minute' => $delta->i,
    'second' => $delta->s);

$str = '';
foreach($quantities as $unit => $value) {
    if($value == 0) continue;
    $str .= $value . ' ' . $unit;
    if($value != 1) {
        $str .= 's';
    }
    $str .=  ', ';
}
$str = $str == '' ? 'a moment ' : substr($str, 0, -2);

echo $str;

输出:

1 year, 9 months, 17 days, 14 hours, 31 minutes, 31 seconds

【讨论】:

  • 他们澄清了,他们没有。 See this answer 以获得更简洁的方法。
  • 我有问题表,有保存 ask_date 2011-11-30 05:25:50 现在我想显示这个问题是在“年、月、日、小时、分钟、秒前提出的”跨度>
  • 以正常方式从数据库中检索该时间戳,将$result['asked_date'] 放入第一个DateTime ($then) 的构造函数中,并将`ago` 附加到最后的$str 中。
  • 是 - 不传递参数会将 DateTime 对象初始化为当前时间戳。
  • 有一个更简单的方法 - 请参阅我的编辑。 if($value == 0) continue;
【解决方案2】:

我一直用这个功能:

function when($datetime) {   

    define("SECOND", 1);
    define("MINUTE", 60 * SECOND);
    define("HOUR", 60 * MINUTE); define("DAY", 24 * HOUR);
    define("MONTH", 30 * DAY); $delta = time() - strtotime($datetime);

    // convert

    if($delta < 1 * MINUTE) { return $delta == 1 ? "one second ago" : $delta." seconds ago"; }
    if($delta < 2 * MINUTE) { return "a minute ago"; } if($delta < 45 * MINUTE) { return floor($delta / MINUTE)." minutes ago"; }
    if($delta < 90 * MINUTE) { return "an hour ago"; } if($delta < 24 * HOUR) { return floor($delta / HOUR)." hours ago"; }
    if($delta < 48 * HOUR) { return "yesterday"; } if($delta < 30 * DAY) { return floor($delta / DAY)." days ago"; }
    if($delta < 12 * MONTH) { $months = floor($delta / DAY / 30); return $months <= 1 ? "one month ago" : $months." months ago"; }
    else { $years = floor($delta / DAY / 365); return $years <= 1 ? "one year ago" : $years." years ago"; }

}

echo when(YOUR DATE HERE) 将返回相对时间的最佳格式,可能是几天、几小时,或者如果不是很久以前,甚至以秒为单位。

【讨论】:

  • 他们不想要两个日期之间的差异
  • 我和@Esaevian 在一起,这个问题没有意义。
  • 谢谢:我用了你的方法,它回显了这个错误:常量 SECOND 已经定义:我在 yii 模型类中使用这个函数
  • 你能确定这个函数只包含一次吗?
  • 这个函数不会那样做。这只会返回一个月、几天、几小时或几秒钟前。尝试在文档中包含较高的脚本并在需要时调用。
【解决方案3】:

试试这个: http://www.php.net/manual/en/function.strtotime.php

PHP 有一个不错的函数strtotime 可以满足您的需求。

这会给你一个时间戳,然后你可以从你减去的任何日期开始计算。

【讨论】:

  • 但就是这样,他们不是在两个不同的日期做数学
  • 我假设他们准备好了第二次约会。不过,如果您想要 2011 years, 11 months, 30 days, 5 hours, 25 minutes, 50 seconds 之类的内容,您可以将单个日期转换为类似的字符串
  • 哼,没关系,我刚看到阿里的评论。现在这个问题没有意义了。
  • 啊! “以前”是一个神奇的词。为此,您确实希望与现在有所不同。 now() - ask_date = 时间前。使用strtotime() 得到asked_date 时间,使用now() 得到当前时间,从asked_date 中减去now 得到以秒为单位的时间差,然后做基本数学计算不同时间单位的差。跨度>
  • 或者,更简单地说,date_diff() -> php.net/manual/en/function.date-diff.php 查看示例/cmets
【解决方案4】:

您可以尝试使用 preg_split 进行拆分。

试试类似的东西

$output = preg_split( "/ (-| |:) /", $input );

这应该给你一个数组,其中第一个元素是年份,第二个是月份,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多