为什么PHP DateTime和strtotime将“ a”和“ asdf”解析为有效日期?

我正在使用PHP开发Web应用程序.我有一个正在通过客户端验证的日期表单,然后使用准备好的语句通过POST提交以插入到数据库中.

除了客户端验证之外,我还想对日期进行服务器端验证,但是我很难理解strtotime和DateTime类的行为.

什么规则允许这两种方法将字符串a转换为今天的日期和strtotime并将asdf转换为1969-12-31?使用date_parse我看到a被识别为有效的时区(以某种方式),但是没有与之关联的时间. asdf更加令人困惑,因为date_parse实际上说找不到时区…但是它仍然出现在1969-12-31

我打算将字符串转换为日期,然后进行测试以确保日期在有效范围内,但是a和asdf都可以通过此测试.我知道我可以使用DateTime :: createFromFormat并指定客户端代码应发送的格式,但我真的很好奇为什么这些功能会像它们那样工作?

解决方法:

strtotime返回为-1

strtotime函数-函数成功返回一个时间戳,否则返回FALSE.
 在PHP 5.1.0之前,此函数在失败时将返回-1.

日期函数-该函数包含两个参数格式和时间戳.现在,根据时间戳整数字段,将创建日期.

因此,创建一个时间戳记为0的日期将得到1970-01-01,为-1则得到1969-12-31,依此类推.

程式码范例

echo Date('Y-m-d', 0); // OUTPUT - 1970-01-01
echo Date('Y-m-d', -1); // OUTPUT - 1969-12-31
echo Date('Y-m-d', false); // OUTPUT - 1970-01-01
echo Date('Y-m-d', strtotime('a')); // OUTPUT - 2018-01-16
echo Date('Y-m-d', strtotime('asdf')); // OUTPUT - 1970-01-01

当前场景

现在,在您的情况下,似乎strtotime函数失败,因此返回-1作为时间戳.因此日期.

有关strtotime函数的更多信息,请参考PHP docs

上一篇:php-laravel中的多文件上传验证


下一篇:javascript-来自网站联系表单的垃圾邮件回复绕过了“必需”和“模式”属性