PHP检查时差

时间:2018-01-09 15:16:24

标签: php symfony datetime-comparison

我正在寻找一种精益方式来比较两次。一个是时间,有人要求新密码(FOS UserBundle提供了一个Getter),另一个是当前时间减去例如10分钟。

if($user->getPasswordRequestedAt() <= date("Y-m-d H:i:s", strtotime('-10 minutes'))){
    return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
  }
  else {
  return $this->render('@User/Resetting/check_email.html.twig', array(
      'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
  ));

因此,如果有人在10分钟前已经请求了密码,他会进入页面说“#34;您已经请求了密码,请等待10分钟重试。”#34;。如果请求超过10分钟,则页面显示&#34;已发送电子邮件以进行密码重置&#34;。

我认为这种比较是正确的,但它总是以某种方式进入&#34;否则&#34;一部分。

哪里出错?

3 个答案:

答案 0 :(得分:0)

if($user->getPasswordRequestedAt() >= date("Y-m-d H:i:s", strtotime('-10 minutes'))){

应该做的伎俩。

由于您要检查上一次请求是在过去10分钟内完成还是更新

答案 1 :(得分:0)

据我所知$user->getPasswordRequestedAt()(因为通过Doctrine处理)是\DateTime的实例。

所以使用另一个日期时间进行比较:

$limit = \new DateTime();
$limit->sub(new \DateInterval("P600S"));

if($user->getPasswordRequestedAt() >= $limit){
    return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}
else {
    return $this->render('@User/Resetting/check_email.html.twig', array(
      'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));

使用此方法,您可以保留OOP样式并使用干净的if子句。 $limit保存10分钟前的时间戳。因此,当您在14:10请求密码并且现在是14:19时,$limit将保持14:09。只要请求的密码日期大于10分钟前的时间戳,就不会重新发送。

编辑:由于您正在使用FOS UserBundle,因此iainn指出它确实可以缩短它:

if($user->isPasswordRequestNonExpired(600)){
    return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}
else {
    return $this->render('@User/Resetting/check_email.html.twig', array(
          'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));

此方法的第一个也是唯一的参数是必须经过的秒数,以便可以再次请求密码。

答案 2 :(得分:0)

由于我没有使用过symfony,我无法确切知道 但这是我的猜测。看看它是否有效。

$dt = $user->getPasswordRequestedAt();
If($dt->getTimestamp() <= strtotime(time())-600){
    return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}else {
     return $this->render('@User/Resetting/check_email.html.twig', array(
  'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));

这会将datetime对象创建为$ dt变量 在if()中,我使用get_timestamp来获取datetime对象的Unix值,并将其与Unix时间-600秒(10分钟)进行比较。

我选择Unix值的原因是因为它们非常适合比较。