【问题标题】:Converting between date formats in PHP [duplicate]在 PHP 中的日期格式之间转换 [重复]
【发布时间】:2013-09-06 12:19:53
【问题描述】:

我有一个网站,要求用户输入一个日期,然后将其存储在 MySQL 数据库中。我想让用户在 m/d/yyyy 中输入日期,并让系统将其转换为 MySQL 所需的 Y-m-d 格式。我认为这很简单,但我不能让它停止犯一个严重的错误,

我尝试了以下方法:

$date = new DateTime($this->vital_date);
$this->vital_date = $date->format('Y-m-d');

当用户输入 9/6/2013 时,2013-06-09 将存储在 MySQL 表中。 (注意月份和日期的换位。

然后,我尝试了旧的、前对象方式:

$date = strtotime($this->vital_date);
$this->vital_date = date('Y-m-d', $date);

这也做了同样的事情——换位的月份和日期。

谁能帮我解决我做错了什么或如何进行更好的转换。

【问题讨论】:

  • 与其直接使用 DateTime,不如使用静态方法DateTime::createFromFormat() 指定日期字符串格式的方法
  • 也许一切都很好,但你的 mysql 使用了错误的(欧洲)格式?您是否尝试保存日期并再次检索?

标签: php date format date-formatting


【解决方案1】:

你应该使用DateTime::createFromFormat

来自 PHP 文档

m/d/y 或 d-m-y 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜线 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。

为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat()。

示例

$vital_date = "9/6/2013";
$date = DateTime::createFromFormat("m/d/Y", $vital_date);
echo $date->format('Y-m-d');

【讨论】:

  • 您应该使用 n 代表月份和 j 代表一天。否则,它需要格式中的前导零。
  • 在您的评估中看不到任何问题。你需要交换jn,所以格式是相等的:)
  • @Baba 我对此有严格的规定:if (in_array($drink, $alcohol)) exit();
  • 其实我好像已经解决了这个问题,而且解决的方法比想象的要简单得多。我正在使用 JQuery UI DatePicker 并没有注意到它以 09-06-2013 格式而不是 09/06/2013 格式输出日期,因此您建议的消除歧义是问题的核心。当我更正它以使用斜杠而不是破折号时,我发现以下内容非常有效:$this->vital_date = date("Y-m-d", strtotime($this->vital_date));——一个简单的单行。非常感谢,你真的让我思考了这个问题的所有方面。
【解决方案2】:

您应该使用DateTime::createFromFormat 用于非标准格式

【讨论】:

    【解决方案3】:

    您可以通过以下方式指定您提供数据的格式:

    $date = DateTime::createFromFormat('j/n/Y', '9/6/2013');
    

    【讨论】:

      【解决方案4】:

      这个示例不仅在这种情况下很明显,而且在许多其他地方也很有用,例如从数学家那里获取信息,在没有正则表达式的情况下在站点文本框中输入二次方程

      或驾驶执照号码可以正确处理并存储在使用scanf格式化的数据库中,例如scanf($input, '%s-%s-%d/%d);等等

      这取决于您的需要,因此您必须了解sscanfscanfprintfsprintfvsprintf

      <?php 
      $date = '9/6/2013';
      
          list($month,$day,$year) = sscanf($date, '%d/%d/%d');
      
          $date = sprintf('%d-%02d-%02d',$year,$month,$day);
      
      echo $date;
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多