php“倒计时直到”和“从那时起” GMT UTC 时间函数

发布于 2024-11-25 05:54:28 字数 2992 浏览 6 评论 0原文

我正在使用我发现可以执行此操作的函数,但我正在尝试使其与 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('Ymd 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 个小时。

有什么想法可能会发生什么吗?

也许错误在于我如何节省目标时间? 当有人提交时间时,其转换和存储如下

用户提交的时间将始终像本地时间一样开始: 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);

I'm working with a function I found to do this, but I'm trying to make it work with a GMT utc timestamp:

EDIT:
Maybe my issue is with how i'm "converting" the user input time to GMT...

I was doing

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

Does gmdate('Y-m-d H:i:s',$the_user_input_date); not actually "convert" it to gmt? does it just format it? Maybe thats my issue.

Here's what the times I can supply would look like:

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

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

I'm trying to get this to work like:

    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

Here's what im working with so far:

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

I tried what you suggested here:

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';
      }
    }

It always seems to add 10 hours on to my time.

Any ideas what could be going on?

Maybe an error lies with how I'm saving the target time?
When someone submits a time its converted and stored like this

The user submitted time will always start out looking like this as their local time:
07/20/2011 11:00 pm

Then:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小耗子 2024-12-02 05:54:28

如果您可以访问 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 分钟前

Provided you have access to PHP >= 5.3 I'd recommend DateTime::diff(). The DateInterval returned gives you all the parts you would need for display as well as has its own methods, such as format().

Here's a sample to give you an idea. There are more complete samples in the comments of the PHP documentation links.

<?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';
}

It outputs (on my system):

22 hours 10 minutes ago

柳絮泡泡 2024-12-02 05:54:28

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

而不是:

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

做:

$datefrom=time();

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

Your $datefrom is a string, but $dateto is an int. You can't subtract them that way.

Instead of:

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

Do:

$datefrom=time();

PS. I did not check the rest of the code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文