【问题标题】:PHP Session variable - find time differencePHP Session 变量 - 查找时差
【发布时间】:2016-04-19 21:24:28
【问题描述】:

我正在尝试编写的程序很简单,找出两个时间之间的差异:今天和用户登录的时间,其中放入会话变量中。

会话变量

$_SESSION['loginTime'];

设置为今天的日期

$_SESSION['loginTime'] = date('Y-m-d H:i:s');

当用户注销时,他们已登录的持续时间在单独的页面上使用此代码找到:

if(isset($_SESSION['loginTime']))
{
    $logTime = $_SESSION['loginTime'];

    $duration = strtotime(date('Y-m-d H:i:s')) - strtotime($logTime);
    $duration = date('H:i:s', $duration);

}

如果我现在(2016 年 4 月 19 日 22:15)登录并保持登录状态 1 分 10 秒,它将返回 01:01:10。我不明白额外的小时是从哪里来的,所有时区都设置​​相同。

  • 分钟和秒计算得很好,但似乎无缘无故地增加了 1 小时

感谢阅读!非常感谢任何帮助!

【问题讨论】:

  • 在你运行date函数之前$duration的unix时间戳值是多少?
  • @Martin 感谢您的回答!你知道有什么方法可以解释夏令时吗?
  • gmdate 如果这是夏令时问题
  • 最好将(另一个)会话变量保存为 unix 时间戳,这样您就不会“在转换中丢失”这些问题。
  • strtotime 的东西是高度冗余的。生成时间戳,将其格式化为字符串,然后将该字符串解析为时间戳?完全没有意义。你只想要以秒为单位的差异,所以$_SESSION['logintime'] = time();,然后是$duration = time() - $_SESSION['logintime']。请注意,您不能使用date() 来格式化间隔。 date 需要一个适当的时间戳。它会很容易地调整间隔。例如如果您的间隔是 1.2 天,h:i:s 将只打印小时/分钟/秒,并放弃这一天,因为您没有告诉它打印那个。

标签: php date session time


【解决方案1】:

DateTime 对象是您的朋友。

来自PHP manual,一个简单的例子如下:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

您可以轻松地将您的代码调整为以下内容:

if(isset($_SESSION['loginTime']))
{
    $logTime = new \DateTime($_SESSION['loginTime']);
    $currentTime = new \DateTime('now');
    $interval = $logTime->diff($currentTime);
    $duration = $interval->format('%H:%i:%s');
}
echo $duration;

示例输出:

15:48:57

【讨论】:

    【解决方案2】:

    这与 DST 无关。它通常与时区有关。 $logTimenow() 之间的差异通常很小,就像 OP 中的分钟一样。对于date,其结果为 1970 年 1 月 1 日。但在大多数欧洲大陆城市中,格林威治标准时间 00:00 是 01:00。

    快速解决方法是使用 gmdate() 而不是 date() 将秒数的差异转换回 H:i:s 格式。正如 David Wyly 建议的那样,正确的解决方案是使用 DateTime 对象和 diff 函数来获取 DateInterval

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2012-06-11
      • 1970-01-01
      • 2016-06-06
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      相关资源
      最近更新 更多