PHP DateTime信用卡到期

时间:2013-10-21 14:02:22

标签: php datetime credit-card

我正在尝试使用DateTime检查信用卡到期日期是否已过期,但我有点迷失。

我只想比较mm / yy日期。

到目前为止,这是我的代码

$expmonth = $_POST['expMonth']; //e.g 08
$expyear = $_POST['expYear']; //e.g 15

$rawExpiry = $expmonth . $expyear;

$expiryDateTime = \DateTime::createFromFormat('my', $rawExpiry);
$expiryDate = $expiryDateTime->format('m y');

$currentDateTime = new \DateTime();
$currentDate = $currentDateTime->format('m y');

if ($expiryDate < $currentDate) {
    echo 'Expired';
} else {
    echo 'Valid';
}

我觉得我差不多了,但if语句产生的结果不正确。任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:11)

这比你想象的要简单。您正在使用的日期格式并不重要,因为PHP会在内部进行比较。

$expires = \DateTime::createFromFormat('my', $_POST['expMonth'].$_POST['expYear']);
$now     = new \DateTime();

if ($expires < $now) {
    // expired
}

答案 1 :(得分:5)

上述答案的补充。 请注意,默认情况下,天数也会计算在内。 例如,今天是2019-10-31,如果运行此命令:

\DateTime::createFromFormat('Ym', '202111');

它将输出2021-12-01,因为在11月不存在第31天,并且它将为DateTime对象增加1天,其副作用是您将在12月而不是预期的11月。 / p>

我的建议是始终在代码中使用这一天。

答案 2 :(得分:4)

您可以使用DateTime class使用DateTime::createFromFormat()构造函数生成与给定日期字符串格式匹配的DateTime对象。

格式('my')将匹配任何日期字符串与字符串模式'mmyy',例如'0620'。或者对于4位数年份的日期,使用格式'mY',它将日期与以下字符串模式'mmyyyy'匹配,例如'062020'。使用DateTimeZone类指定时区也是明智的。

$expiryMonth = 06;
$expiryYear = 20;
$timezone = new DateTimeZone('Europe/London');
$expiryTime = \DateTime::createFromFormat('my', $expiryMonth.$expiryYear, $timezone);

有关更多格式,请参阅DateTime::createFromFormat页面。

但是 - 对于信用卡/借记卡到期日,您还需要考虑完整的到期日期和时间 - 而不仅仅是月份和年份。

如果未指定,

DateTime::createFromFormat将默认使用当天的某一天(例如17)。这意味着,如果信用卡还有几天的时间可能会过期。如果卡在06/20(即2020年6月)到期,则它实际上在2020年7月1日00:00:00停止工作。modify方法解决了这个问题。 E.g。

$expiryTime = \DateTime::createFromFormat('my', $expiryMonth.$expiryYear, $timezone)->modify('+1 month first day of midnight');

字符串'+1 month first day of midnight'完成三件事。

  • '+ 1个月' - 加一个月。
  • '第一天' - 切换到该月的第一天
  • '午夜' - 将时间更改为00:00:00

修改方法对于许多日期操作非常有用!

所以要回答这个问题,这就是你需要的:

$timezone = new DateTimeZone('Europe/London');
$expiryTime = \DateTime::createFromFormat(
  'my',
   $_POST['expMonth'].$_POST['expYear'],
   $timezone
)->modify('+1 month first day of midnight');

$currentTime = new \DateTime('now', $timezone);

if ($expiryTime < $currentTime) {
    // Card has expired.
}

答案 3 :(得分:1)

对于op的问题:

$y=15;
$m=05;

if(strtotime( substr(date('Y'), 0, 2)."{$y}-{$m}" ) < strtotime( date("Y-m")  ))
{
  echo 'card is expired';
}

对于全年的其他人:

$y=2015;
$m=5;

if(strtotime("{$y}-{$m}") < strtotime( date("Y-m")  ))
{
  echo 'card is expired';
}

答案 4 :(得分:0)

best answer由John Conde提供。它执行最少量的处理:创建两个正确的DateTime对象,比较它们,这就是它所需要的。

它也可以在您开始时起作用,但您必须以将年份放在第一位的方式格式化日期。

请仔细考虑一下:由于日期08/15(2015年8月)在12/14之后(2014年12月),但作为字符串,'08 15''12 14'之前。< / p>

当年份在前面时,即使作为字符串,年份首先进行比较,只有在年份相等的情况下才比较月份:

$expiryDate  = $expiryDateTime->format('y m');
$currentDate = $currentDateTime->format('y m');

if ($expiryDate < $currentDate) {
    echo 'Expired';
} else {
    echo 'Valid';
}

答案 5 :(得分:0)

比较字符串&#34; 201709&#34;是不是更简单?到本年度?我想,创建日期时间对象会花费一些精力。

if($_POST['expYear']. str_pad($_POST['expMonth'],2,'0') < date('Ym')) {
   echo 'expired';

}

答案 6 :(得分:0)

请保持简单,就像我上面的回答说的一样,除了您需要在左侧拉线:

isCardExpired($month, $year)
{
    $expires = $year.str_pad($month, 2, '0', STR_PAD_LEFT);
    $now = date('Ym');

    return $expires < $now;
}

无需使用DateTime

添加额外的PHP负载