如何在PHP中检查日期格式?

4
我的MySQL服务器使用mm/dd/yyyy日期格式,但我使用jQuery实现的日期选择器给出的日期格式为dd/mm/yyyy
所以我编写了以下代码来检查输入是否符合mm/dd/yyyy格式,但无论日期输入以哪种格式给出,它都被评估为true。PHP代码如下:
$Temp = DateTime::createFromFormat('d/m/Y', $StartsOn);
    if($Temp) 
        $Temp->format('m/d/Y');

如果输入是dd/mm/yyyy格式,我需要将其转换为mm/dd/yyyy格式。请告诉我我的代码中存在什么逻辑错误。


为什么添加sql-server标签?你的问题只涉及php相关。 - Ionic
因为我正在尝试使用DateTime::createFromFormat()函数,因为我觉得使用explode是一种粗暴的方式来实现我的目标。 - SoundStage
1
日期列的定义是什么,因为它以 mm/dd/yyyy 的格式并不常见?通常我期望看到的是 yyyy-mm-dd 的格式。 - DanielM
1
只是提醒一下,无法正确地区分 mm/dd/yyyy 和 dd/mm/yyyy(这就是为什么你永远不应该使用前者,对不起美国)。例如 02/03/2015 是三月的第二天还是二月的第三天。参考:https://xkcd.com/1179/ - DanielM
1
使用 xx-xx-xxxxxx/xx/xxxx 格式时,PHP 将 - 作为美国格式的分隔符,将 / 作为欧洲格式的分隔符 - 正如文档所述,http://php.net/manual/en/datetime.formats.date.php。 - Mark Baker
显示剩余11条评论
3个回答

4

要可靠地检查一个日期是否是以 dd/mm/yyyymm/dd/yyyy 的格式,是不可能的。考虑这样一个日期,比如 "May, 7th"。
根据不同格式,它可以是 07/05/2015 或者 05/07/2015。因此如果你只有日期字符串没有其他信息,你无法确定例如 05/07/2015May, 7th 还是 July, 5th

很抱歉,对于你的问题,没有逻辑上的解决方案。


2
strtotime的PHP手册中可知:

m/d/y或d-m-y格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/),则假定为美国m/d/y格式;而如果分隔符是破折号(-)或点(.),则假定为欧洲d-m-y格式。为避免潜在的歧义,最好使用ISO 8601(YYYY-MM-DD)日期或DateTime :: createFromFormat()。

将日期传递给SQL服务器的原因是由于分隔符而起作用。尽可能地使用按ISO 8601创建的YYYY-MM-DD格式传递,这正是为此目的而创建的。要解决问题,最好更改jQuery插件配置以输出该格式的数据(如果不可能,请在从jQuery插件获取的位置用字符串替换/-)。这将通过编写修复日期格式的代码来避免未来的复杂性。
当你不知道它来自哪里时,你将无法区分mm/dd/yyyy和dd/mm/yyyy之间的区别。

0
您可以使用 PHP.net 上的修改版本函数。它使用 DateTime 类:
function validateDate($date)
{
    $d = DateTime::createFromFormat('d/m/Y', $date);
    return $d && $d->format('d/m/Y') == $date;
}

if(validateDate($StartsOn)){
//do job
}

这个函数是从答案或者php.net复制过来的


这只适用于日期中月份大于12的情况。否则,你仍然不知道例如“08/09/2015”是指“9月8日”还是“8月9日”。 - low_rents
@low_rents 我们正在验证日期格式是否正确,而不是实际日期是否正确。 - Faiz Rasool
@low_rents,你有时间查一下问题标题“如何在PHP中检查日期格式”吗? - Faiz Rasool
1
是的 - 他/她正在询问如何检查日期使用哪种格式,而不是如何验证它。 - low_rents
为什么应该使用这个函数?请解释一下你做了什么以及为什么要这样做,不仅是为了 OP,也是为了未来访问 Stack Overflow 的用户。 - Jay Blanchard
我不是在寻求验证日期格式,而是需要检查明确使用了哪种日期格式。 - SoundStage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接