php "倒计时 til" 和 "since time" GMT UTC 时间函数

Posted

技术标签:

【中文标题】php "倒计时 til" 和 "since time" GMT UTC 时间函数【英文标题】:php "countdown til" and "since time" GMT UTC time function 【发布时间】:2011-10-09 20:11:52 【问题描述】:

我正在使用我发现可以执行此操作的函数,但我正在尝试使其与 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;
 

@杰森

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

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 个小时。

有什么想法吗?

我如何节省目标时间可能是一个错误? 当有人提交时间时,它会像这样转换和存储

用户提交的时间总是以他们的本地时间开始: 2011 年 7 月 20 日晚上 11:00

然后:

$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);

【问题讨论】:

您使用的是什么版本的 PHP? PHP >= 5.3 的DateTime 类中内置了很多这种功能。 PHP 5.2 FastCGI 是根据我的主机提供商当前设置的。如果我进行切换,它让我可以选择PHP 5.3 FastCGI。我该如何做我想要完成的事情? 【参考方案1】:

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

这里有一个示例,可以让您了解一下。 PHP 文档链接的 cmets 中有更完整的示例。

<?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 分钟前

【讨论】:

谢谢 Jason,我仍然遇到一些奇怪的错误,似乎还有几个小时。我更新了我的帖子,向您展示我的尝试。有什么想法吗? 我相信这源于您对时间的存储。很多地方都可能发生这种情况——PHP、MySQL 等。我的建议是全面采用 GMT。 这就是我已经在做的事情。如果您看上面,我向您展示了我是如何在用户指定时间时花时间将其转换为 GMT 的。我获取 GMT 的过程不正确吗? (它在我几分钟前添加的问题的底部) $datetime2 = new DateTime();你的系统获取当前时间。我鼓励您调试这些时间,并从文档中阅读更多内容,并尝试自己走得更远。 好吧,我试过time()DateTime(time()),因为我知道time() 是格林威治标准时间。但它需要一个日期时间时间戳。所以我尝试$datetime2 = new DateTime(date("Y/m/d\TH:i:s",time())); 只是将 time() 转换为 datetime 可以接受的东西。但这仍然给了我大约 3 小时前的时间,而不是预期的时间。附带说明一下,我通常使用 flex builder (eclipse) 我不太确定如何调试 php。 Eclipse 使调试变得轻而易举,当在浏览器上执行 php 时,我感觉自己几乎一无所知。我不经常这样做。【参考方案2】:

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

代替:

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

做:

$datefrom=time();

PS。我没有检查其余的代码。

【讨论】:

我完全按照您的建议进行了尝试。然后尝试了一个小时后的echo ago('2011/07/20/T21:23:00Z'),它显示了-10919 seconds ago,所以我认为这不起作用:/ 2011/07/20/T21:23:00Z 距离现在 EDT 一个小时。做2011/07/20/T21:23:00 EDT 是正确的。或者只是 2011/07/20/T21:23:00 当地时间。 另一件事,如果我做 time() 不只是得到服务器时间吗?我需要它是格林威治标准时间,所以它总是一个标准化的时间。这就是我尝试使用 gmdate 的原因 对不起,我只是在调查它。你的权利。但我刚刚用2011/07/20T22:38:00 再次尝试过,距现在一个小时,但它说的是 3 小时前。有什么想法吗? 这是颠倒过来的吗? $difference = $dateto - $datefrom; 我想可能需要$difference = $datefrom - $dateto;

以上是关于php "倒计时 til" 和 "since time" GMT UTC 时间函数的主要内容,如果未能解决你的问题,请参考以下文章

求助PHP倒计时程序

JS或者PHP的倒计时程序代码

用JavaScript或php怎么写一个倒计时时钟啊

快速倒计时计时器逻辑

云网一体,“湘"遇"湘"融 | 移动云TeaTalk·长沙站 启动倒计时

简单实现2020年倒计时