PHP 的时间和日期比较无法使用 date()
PHP's time and date comparison not working using date()
我想在我的输入表单中添加验证规则,这样人们就不能选择比今天早的日期,但出于某种原因,我的操作员没有像他们应该的那样工作……至少我认为他们没有
//plain use of comparison operators
$a = 4; $b = 4;
if($a <= $b) { echo "umm?"; } // this return true
date_default_timezone_set('Europe/Copenhagen');
$timezone = date_default_timezone_get();
$today = date("d/m/y");
if(!empty($date['dateA']) && (date($date['dateA']) <= $today)) {
现在最后一个 if
语句正在获取 $today
值,其格式与 $date
数组格式相同。
这就是让我发疯的原因……如果:
$today = 08/02/2015
$date = 07/02/2015
return是真的
$date = 08/02/2015
returns false 为什么这个 returning true
?
当我使用 <=
来确保 $date
不能高于 $today
时,为什么 $date <= $today
不会 [=41] =] true
当他们有相同的值时?
据我所知,它的行为或多或少像 $date < $today
此外,我尝试使用 strtotime
而不是 $date
的日期,但它仍然表现相同....
那怎么办?
目前它首先检查较小的日期数字,而它应该首先检查年份,因为字符串比较一次检查 1 个字符,从左到右。
您可以将日期格式存储在 year/month/day 中以解决此问题,但这样做有点丑陋。
我建议使用时间戳,这是自 1970 年 1 月 1 日格林威治标准时间 00:00:00 以来的秒数,可以在 PHP 中通过调用 time() 获取当前时间戳。您可以通过调用 strtotime() 检索特定日期的时间戳。
我不知道你为什么要坚持字符串比较。我建议对数学数字使用数学运算。
这样做:
if(strtotime($date) < time())
{
// then allow doing something
}
strtotime()
将您已有的日期字符串(例如:"22/5/2014"
)转换为整数时间戳。 time()
还有 returns 今天的时间戳。然后,您可以使用这两个数字进行操作。
虽然以上完全有效,但您还可以使用 PHP 中的日期对象,它非常精确并且隐式计算闰年等内容
PHP 文档中的示例:
<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>
在此处阅读更多内容:
http://php.net/manual/en/datetime.diff.php
您目前正在使用字符串比较,这不是比较日期的推荐方法。不过,我不知道为什么相等性检查失败,但我认为您应该改用 DateTime 对象:http://php.net/manual/en/class.datetime.php(仅当您使用 PHP >= 5.2.2 时,因为 PHP 手册说 DateTime 比较在以前的版本中不能正常工作)
在您的情况下,最后一行将变为:
if(!empty($date['dateA']) && DateTime::createFromFormat('d/m/Y', $date['dateA']) <= DateTime::createFromFormat('d/m/Y', $today))
我想在我的输入表单中添加验证规则,这样人们就不能选择比今天早的日期,但出于某种原因,我的操作员没有像他们应该的那样工作……至少我认为他们没有
//plain use of comparison operators
$a = 4; $b = 4;
if($a <= $b) { echo "umm?"; } // this return true
date_default_timezone_set('Europe/Copenhagen');
$timezone = date_default_timezone_get();
$today = date("d/m/y");
if(!empty($date['dateA']) && (date($date['dateA']) <= $today)) {
现在最后一个 if
语句正在获取 $today
值,其格式与 $date
数组格式相同。
这就是让我发疯的原因……如果:
$today = 08/02/2015
$date = 07/02/2015
return是真的
$date = 08/02/2015
returns false 为什么这个 returning true
?
当我使用 <=
来确保 $date
不能高于 $today
时,为什么 $date <= $today
不会 [=41] =] true
当他们有相同的值时?
据我所知,它的行为或多或少像 $date < $today
此外,我尝试使用 strtotime
而不是 $date
的日期,但它仍然表现相同....
那怎么办?
目前它首先检查较小的日期数字,而它应该首先检查年份,因为字符串比较一次检查 1 个字符,从左到右。
您可以将日期格式存储在 year/month/day 中以解决此问题,但这样做有点丑陋。
我建议使用时间戳,这是自 1970 年 1 月 1 日格林威治标准时间 00:00:00 以来的秒数,可以在 PHP 中通过调用 time() 获取当前时间戳。您可以通过调用 strtotime() 检索特定日期的时间戳。
我不知道你为什么要坚持字符串比较。我建议对数学数字使用数学运算。
这样做:
if(strtotime($date) < time())
{
// then allow doing something
}
strtotime()
将您已有的日期字符串(例如:"22/5/2014"
)转换为整数时间戳。 time()
还有 returns 今天的时间戳。然后,您可以使用这两个数字进行操作。
虽然以上完全有效,但您还可以使用 PHP 中的日期对象,它非常精确并且隐式计算闰年等内容
PHP 文档中的示例:
<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>
在此处阅读更多内容: http://php.net/manual/en/datetime.diff.php
您目前正在使用字符串比较,这不是比较日期的推荐方法。不过,我不知道为什么相等性检查失败,但我认为您应该改用 DateTime 对象:http://php.net/manual/en/class.datetime.php(仅当您使用 PHP >= 5.2.2 时,因为 PHP 手册说 DateTime 比较在以前的版本中不能正常工作)
在您的情况下,最后一行将变为:
if(!empty($date['dateA']) && DateTime::createFromFormat('d/m/Y', $date['dateA']) <= DateTime::createFromFormat('d/m/Y', $today))