Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将特定格式的日期转换为unix,然后比较_Php_Date - Fatal编程技术网

Php 将特定格式的日期转换为unix,然后比较

Php 将特定格式的日期转换为unix,然后比较,php,date,Php,Date,我在PHP中比较两个日期时遇到问题。我想将当前日期与用户输入的日期进行比较 $date = "18/05/2018"; 用户输入的日期 $date_unix = strtotime($date); 用于将日期从给定格式转换为时间,以便进行比较 if($date_unix < time()){ echo '<b>Notice:</b> You cannot specify a date in the past.<br>'; }

我在PHP中比较两个日期时遇到问题。我想将当前日期与用户输入的日期进行比较

$date = "18/05/2018";
用户输入的日期

$date_unix = strtotime($date);
用于将日期从给定格式转换为时间,以便进行比较

if($date_unix < time()){
        echo '<b>Notice:</b> You cannot specify a date in the past.<br>';
    }
上面的if语句总是运行的,我不知道为什么。任何帮助都将不胜感激。

来自:

通过查看各个组件之间的分隔符,可以消除m/d/y或d-m-y格式的日期歧义:如果分隔符是斜杠/,则假定为美式m/d/y

由于2018年5月18日不是美国格式的有效日期,其中第一个数字表示月份,您的STROTIME呼叫将返回false。假零总是小于时间

如果您对输入的格式有信心,最简单的修复方法是在转换为时间戳之前用破折号替换斜杠。然后,STROTIME将字符串解释为国际日期,该日期将正常工作:

$date = str_replace('/', '-', "18/05/2018");
$date_unix = strtotime($date);

但是,更新代码以使用DateTime类(如smith或LSerni的回答中所述)可能会给您带来更大的灵活性。

要解决此问题,请使用上面提供的信息,我使用explode将$date变量拆分为一个数组,然后重新排列生成的数组。然后,我将分解后的变量拼凑在一起,形成正确的美国日期格式

以下是与上述描述相关的代码:

$splitdate = (explode("/",$date));
$splitdate_day = $splitdate[0];
$splitdate_month = $splitdate[1];
$splitdate_year = $splitdate[2];

$date_change = $splitdate_month . "/" . $splitdate_day . "/" . $splitdate_year;

if(strtotime($date_change) < time()){
        echo '<b>Notice:</b> You cannot specify a date in the past.<br>';
    }

这可能不是最有效的方法,但它解决了我遇到的问题。

应该停止使用遗留strotime,开始使用DateTime类

$date = "18/05/2018";

$newDate = DateTime::createFromFormat('d/m/Y', $date);

if (new DateTime() < $newDate) {
echo 'future';
}else{
echo 'past';
}
strotime对日期格式进行假设,在这种情况下,这些假设是错误的

您使用的是像我一样的日/月/年格式:这是意大利的默认格式。昨天,Strotime将2018年5月12日定为2018年12月5日。这项测试本可以通过,而且显然是正确的

如果是预订的话,七个月的费用就会产生-D

所以一定要指定格式。为此,我觉得最好的方法是使用DateTime:

出于同样的原因


此外,要警惕夏令时。

$date=[18/05/2018];这是一个数组!抱歉,这是我的语法错误-将立即编辑。它不是实际程序中的数组,只是错误地输入到stackoverflow中。您是否尝试过转储此值$date_unix?是的,此值可以使用echo输出,只显示:2018年5月18日m/d/y或d-m-y格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠/,然后假设为美国m/d/y,即使在“梅里凯”中也没有第18个月,我们添加了一些额外的细节。然而,我最初的答案确实回答了一个问题,即为什么这种比较不起作用?
 $date = date_create_from_format('d/m/Y', '18/05/2018');