为什么是';a';和';asdf&x27;通过PHP DateTime和StrotTime解析为有效日期?

为什么是';a';和';asdf&x27;通过PHP DateTime和StrotTime解析为有效日期?,php,validation,date,datetime,Php,Validation,Date,Datetime,我正在使用PHP开发一个web应用程序。我有一个日期表,它正在客户端验证,然后通过POST提交,并使用准备好的语句插入到数据库中 除了客户端验证之外,我还想对日期进行服务器端验证,但我很难理解strotime和DateTime类的行为 什么规则允许这两种方法将字符串a转换为今天的日期,以及strotime将asdf转换为1969-12-31?使用date\u parse我看到a被识别为一个有效的时区(不知何故),但没有与之相关的时间asdf更令人困惑,因为date\u parse实际上说时区找不

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

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

什么规则允许这两种方法将字符串
a
转换为今天的日期,以及
strotime
asdf
转换为1969-12-31?使用
date\u parse
我看到
a
被识别为一个有效的时区(不知何故),但没有与之相关的时间
asdf
更令人困惑,因为
date\u parse
实际上说
时区找不到…
但它仍然给出了1969-12-31


我计划将字符串转换为日期,然后进行测试以确保日期在有效范围内,但
a
asdf
都可以通过此测试。我知道我可以使用
DateTime::createFromFormat
并指定客户端代码应该发送的格式,但我真的很好奇为什么这些函数会这样做?

检查strotime的返回是否有错误,错误时返回-1

strotime希望得到一个包含英文日期格式的字符串,并尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)

在您的情况下,您的日期无效,您使用的是-1返回为,并从1970年1月1日00:00:00开始偏移。

strotime返回为-1 strotime函数-函数在成功时返回时间戳,否则返回时间戳。
在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
当前情景

现在,在您的例子中,
strotime
函数似乎失败了,因此返回
-1
作为时间戳。日期就这样定了


有关
strotime
function

您使用的php版本的更多信息,请参阅?是否小于5.1.0?请注意,获取
1969-12-31
是另一个问题。如果您提供的函数期望Unix时间戳(例如,
date()
)具有无效输入,并且您居住在格林西边,PHP将乐意将其转换为整数
0是Unix时代,你的时区将完成剩下的部分。这是1969-12-31的附带问题。我用的是PHP7.0我用的是PHP7.0,但你说的很有意义。事实上,我发现了,因为我的时区,(int)0实际上比1970-01-01早了几个小时,因此1969-12-31“0将给出1970-01-01”这是误导。0是映射到不同本地时间的固定时间。如果不设置本地时间,PHP将为您设置。