【问题标题】:How to check format of Date in PHP?如何在 PHP 中检查日期的格式?
【发布时间】:2015-06-15 12:52:25
【问题描述】:

我的 SQL 服务器使用 mm/dd/yyyy 日期格式,但我使用 jQuery 实现的日期选择器将日期格式设置为 dd/mm/yyyy

所以我对此进行了编码以检查给定输入的格式是否为mm/dd/yyyy,但无论输入的日期以哪种格式给出,它都会评估为真。PHP 代码是,

$Temp = DateTime::createFromFormat('d/m/Y', $StartsOn);
    if($Temp) 
        $Temp->format('m/d/Y');

仅当输入为dd/mm/yyyy 时,我才需要转换为mm/dd/yyyy 格式。所以请告诉我我在代码中犯的逻辑错误是什么。

【问题讨论】:

  • 你为什么不把mm/dd/yyyy炸开然后放在一起呢?
  • 为什么是 sql-server 标签?你的问题只是 php 相关的。
  • 日期列的定义是什么,因为它是 mm/dd/yyyy 是不寻常的?通常我希望看到它为 yyyy-mm-dd。
  • 仅供参考,没有办法正确区分 mm/dd/yyyy 和 dd/mm/yyyy (这就是为什么你永远不应该使用前者,对不起美国) .例如 02/03/2015 3 月 2 日或 2 月 3 日。参考:xkcd.com/1179
  • 使用xx-xx-xxxxxx/xx/xxxx,PHP 将- 分隔符视为美国格式,/ 分隔符视为欧洲格式 - 如文档所述,php.net/manual/en/datetime.formats.date.php

标签: php


【解决方案1】:

来自PHP manual on strtotime

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

将日期传递给 SQL Server 的原因是 mm/dd/yyyy 是因为分隔符。在可能的情况下,最好始终按照 ISO 8601 传递 YYYY-MM-DD,这正是为此目的而创建的。要解决您的问题,最好的办法是更改 jQuery 插件配置以以该格式输出数据(如果这不可能,请将 / 字符串替换为来自 jQuery 插件的 -。这将通过编写来避免未来的复杂化修复日期格式的代码。

当你不知道它来自哪里时,你将无法区分 mm/dd/yyyy 和 dd/mm/yyyy。

【讨论】:

    【解决方案2】:

    不可能可靠地检查日期是dd/mm/yyyy 还是mm/dd/yyyy 格式。想想像“5 月 7 日”这样的日期。
    这将是 07/05/201505/07/2015,具体取决于格式。因此,如果您刚刚获得没有其他信息的日期字符串,您将无法判断例如 05/07/2015May, 7th 还是 July, 5th

    很抱歉,您的问题没有合乎逻辑的解决方案。

    【讨论】:

    • 感谢您的意见,我明白这里的问题了。
    【解决方案3】:

    您可以从 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
    }
    

    函数是从 answerphp.net 复制而来的

    【讨论】:

    • 这仅适用于当月日期大于 12 的日期。否则您仍然不知道例如 08/09/2015 是指“9 月 8 日”还是“8 月 9 日”。
    • @low_rents 我们正在验证日期格式是否正确,而不是实际日期是否正确。
    • @low_rents 你有没有改一下来查找问题的标题如何在 PHP 中检查日期的格式?
    • 是的 - 她/他在问如何检查日期使用的格式 - 而不是如何验证它。
    • OP为什么要“使用这个功能”?请添加对您所做的事情以及为什么这样做的解释,不仅是为了 OP,也是为了 SO 的未来访问者。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多