【问题标题】:How to convert strtotime format for calculating time elapsed如何转换 strtotime 格式以计算经过的时间
【发布时间】:2015-03-12 20:21:00
【问题描述】:

我正在尝试将经过的时间放在评论框中。

尝试使用下面的代码,但是它给了我 45 年的时间。

这是我的代码

    $data = $row['created_on'];
    $time = strtotime('$data');
    <li>
        <span class="author">
            <?php echo $row['name']; ?>
        </span>
        <span class="time">
            <?php echo ''.humanTiming($time).' ago'; ?>
        </span><br/>
        <div class="c_content">
            <?php echo $row['comment']; ?>
        </div>
        <div class="clear"></div>
    </li>
<?php } ?>
</ul>
<?php
function humanTiming ($time){ 
    $time = time() - $time; // to get the time since that moment
    $tokens = array (
        31536000 => 'year',
        2592000 => 'month',
        604800 => 'week',
        86400 => 'day',
        3600 => 'hour',
        60 => 'minute',
        1 => 'second'
    );
    foreach ($tokens as $unit => $text) {
        if ($time < $unit) continue;
        $numberOfUnits = floor($time / $unit);
        return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
    }
}

【问题讨论】:

  • $data = $row['created_on'];那真的是 $data 不是 $date 吗? $time = strtotime('$date');删除单引号。它应该是 $time = strtotime($date);
  • unix 时代开始于大约 45 年前。这意味着您尝试输入日期的某个地方返回错误或“0”。这是 45 年前的 unix 时间戳的开始。我的第一个想法是删除 $time = strtotime('$date'); 中的单引号,就像 @DarkZ3ro11 说的那样。
  • @Dish_Rex 是的,我也尝试删除单引号,但它给出了空白输出。 DarkZ3r011 抱歉正在尝试某些东西,忘记改回来了。
  • 您是否尝试输出 $row['created_on']?也许它是空的,或者查询返回的是空的或假的,我尝试了你的代码及其工作,我尝试了这种日期格式 03/12/2015,
  • @DarkZ3ro11 是的,它给了我正确的时间戳。 $row['created_on'] 的输出是 2015-03-13 01:28:05

标签: php datetime time date-difference


【解决方案1】:
function timeAgo($time_ago)
{
    $time_ago = strtotime($time_ago);
    $cur_time   = time();
    $time_elapsed   = $cur_time - $time_ago;
    $seconds    = $time_elapsed ;
    $minutes    = round($time_elapsed / 60 );
    $hours      = round($time_elapsed / 3600);
    $days       = round($time_elapsed / 86400 );
    $weeks      = round($time_elapsed / 604800);
    $months     = round($time_elapsed / 2600640 );
    $years      = round($time_elapsed / 31207680 );
    // Seconds
    if($seconds <= 60){
        return "now";
    }
    //Minutes
    else if($minutes <=60){
        if($minutes==1){
            return "1mn";
        }
        else{
            return "$minutes"."mn";
        }
    }
    //Hours
    else if($hours <=24){
        if($hours==1){
            return "1h";
        }else{
            return "$hours"."h";
        }
    }
    //Days
    else if($days <= 7){
        if($days==1){
            return "1j";
        }else{
            return "$days"."j";
        }
    }
    //Weeks
    else if($weeks <= 4.3){
        if($weeks==1){
            return "1sm";
        }else{
            return "$weeks"."sm";
        }
    }
    //Months
    else if($months <=12){
        if($months==1){
            return "1m";
        }else{
            return "$months"."m";
        }
    }
    //Years
    else{
        if($years==1){
            return "1a";
        }else{
            return "$years"."a";
        }
    }
}

【讨论】:

  • 所以问题出在你的变量值上,回显看看它的值
  • 是的,即使我这么认为,但无法弄清楚。
【解决方案2】:

这是一种让您的人工计时的聪明方法......

注意:此解决方案不支持任何时区声明,您需要将其添加到您的 DateTime declarations

$data="2015-03-13 01:28:05";  // declare your input
$then=new DateTime($data);    // feed input to DateTime
$now=new DateTime();         // get DateTime for Now
$diff=(array)$then->diff($now);      // calculate the difference & cast as array
$labels=array("y"=>"year","m"=>"month","d"=>"day","h"=>"hour","i"=>"minute","s"=>"second");
$readable="";       // declare as empty string
// filter the $diff array to only include the desired elements and loop
foreach(array_intersect_key($diff,$labels) as $k=>$v){
    if($v>0){  // only add non-zero values to $readable
        $readable.=($readable!=""?", ":"")."$v {$labels[$k]}".($v>1?"s":"");
        //  use comma-space as glue | show value | show unit | pluralize when necessary
    }
}
echo "$readable ago";
// e.g. 2 years, 9 days, 23 hours, 1 minute, 7 seconds ago

在这个工作Demo中亲自看看。

如果你只是在寻找一个函数:

function humanTiming($time){
    $then=new DateTime($time);
    $now=new DateTime();
    $diff=(array)$then->diff($now);
    $labels=array("y"=>"year","m"=>"month","d"=>"day","h"=>"hour","i"=>"minute","s"=>"second");
    $readable="";
    foreach(array_intersect_key($diff,$labels) as $k=>$v){
        if($v>0){
            $readable.=($readable!=""?", ":"")."$v {$labels[$k]}".($v>1?"s":"");
        }
    }
    return "$readable ago";
}

...
    <span class="time">
        <?php echo humanTiming($row['created_on']); ?>
    </span><br/>
...

【讨论】:

  • @swap 如果我的回答充分解决了您的问题,请给它一个绿色勾号(也许是对改进您的流程的赞成票)。通过选择最佳答案,您的问题将从未回答的问题列表中删除 - 使 SO 更完整,对未来的研究人员有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多