php“倒计时直到”和“自时间”GMT UTC时间功能

时间:2011-07-21 00:04:12

标签: php datetime timestamp countdown gmt

我正在使用我发现的功能,但我正在尝试使用GMT utc时间戳:

编辑: 也许我的问题在于如何将用户输入时间“转换”为GMT ......

我在做

$the_user_input_date = strtotime('2011-07-20T01:13:00');
$utctime = gmdate('Y-m-d H:i:s',$the_user_input_date);

gmdate('Y-m-d H:i:s',$the_user_input_date);实际上没有将其“转换”为gmt吗?它只是格式化吗?也许这就是我的问题。

以下是我可以提供的时间:

//local time in GMT
2011-07-20T01:13:00

//future time in GMT
2011-07-20T19:49:39

我正试图让它像以下一样工作:

    Started 36 mins ago
    Will start in 33 mins
    Will start in 6 hrs 21 mins
    Will start in 4 days 4 hrs 33 mins

到目前为止,我正在使用的是:

EDIT: new php code im working with, seems to ADD 10 HOURS on to my date. Any ideas? I  updated it here:

function ago($from)
 {
  $to = time();

  $to = (($to === null) ? (time()) : ($to));
  $to = ((is_int($to)) ? ($to) : (strtotime($to)));
  $from = ((is_int($from)) ? ($from) : (strtotime($from)));

  $units = array
  (
   "year"   => 29030400, // seconds in a year   (12 months)
   "month"  => 2419200,  // seconds in a month  (4 weeks)
   "week"   => 604800,   // seconds in a week   (7 days)
   "day"    => 86400,    // seconds in a day    (24 hours)
   "hour"   => 3600,     // seconds in an hour  (60 minutes)
   "minute" => 60,       // seconds in a minute (60 seconds)
   "second" => 1         // 1 second
  );

  $diff = abs($from - $to);
  $suffix = (($from > $to) ? ("from now") : ("ago"));

  foreach($units as $unit => $mult)
   if($diff >= $mult)
   {
    $and = (($mult != 1) ? ("") : ("and "));
    $output .= ", ".$and.intval($diff / $mult)." ".$unit.((intval($diff / $mult) == 1) ? ("") : ("s"));
    $diff -= intval($diff / $mult) * $mult;
   }
  $output .= " ".$suffix;
  $output = substr($output, strlen(", "));

  return $output;
 }

@Jason

我尝试了你在这里建议的内容:

function ago($dateto)
    {
      $datetime1 = new DateTime( $dateto);
      $datetime2 = new DateTime();
      $interval = $datetime1->diff($datetime2);
      // print_r($interval);

      $format = '';
      if ($interval->h) {
              $format .= ' %h ' . ($interval->h == 1 ? 'hour' : 'hours');
      }
      if ($interval->i) {
              $format .= ' %i ' . ($interval->i == 1 ? 'minute' : 'minutes');
      }
      // more logic for each interval

      if ($format) {
              echo $interval->format($format), ' ago';
      }
      else {
              echo 'now';
      }
    }

似乎总是增加10个小时到我的时间。

任何想法可能会发生什么?

也许错误在于我如何节省目标时间? 当有人提交转换并存储的时间时,就像这样

用户提交的时间总是看起来像当地时间一样: 07/20/2011 11:00 pm

然后:

$time = mysql_real_escape_string($_POST['time']);

$the_date = strtotime($time);

//make user input time into GMT time
$utctime = gmdate('Y/m/d H:i:s',$the_date);

$query = "INSERT INTO $table (time) VALUES ('$utctime');";
mysql_query($query);

2 个答案:

答案 0 :(得分:2)

如果您可以访问PHP> = 5.3,我建议DateTime::diff()。返回的DateInterval为您提供了显示所需的所有部分,并且有自己的方法,例如format()

这是一个给你一个想法的例子。 PHP文档链接的注释中有更完整的示例。

<?php
$datetime1 = new DateTime('2011-07-20');
$datetime2 = new DateTime();
$interval = $datetime1->diff($datetime2);
// print_r($interval);

$format = '';
if ($interval->h) {
        $format .= ' %h ' . ($interval->h == 1 ? 'hour' : 'hours');
}
if ($interval->i) {
        $format .= ' %i ' . ($interval->i == 1 ? 'minute' : 'minutes');
}
// more logic for each interval

if ($format) {
        echo $interval->format($format), ' ago';
}
else {
        echo 'now';
}

输出(在我的系统上):

  

22小时10分钟前

答案 1 :(得分:0)

您的$datefrom是一个字符串,但$dateto是一个整数。你不能这样减去它们。

而不是:

$datefrom=gmdate("Y/m/d\TH:i:s\Z");

执行:

$datefrom=time();

PS。我没有检查剩下的代码。