【发布时间】: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将只打印小时/分钟/秒,并放弃这一天,因为您没有告诉它打印那个。