1

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

我尝试了以下方法:

$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);

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

任何人都可以就我做错了什么或如何进行更好的转换给我任何帮助。

4

4 回答 4

3

您应该使用DateTime::createFromFormat

来自 PHP 文档

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

为避免潜在的歧义,最好尽可能使用 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');
于 2013-09-06T12:24:55.783 回答
1

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

于 2013-09-06T12:24:48.623 回答
1

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

$date = DateTime::createFromFormat('j/n/Y', '9/6/2013');
于 2013-09-06T12:25:11.673 回答
0

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

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

这取决于您的需要,因此您必须了解sscanf, scanf, printf, sprintf,vsprintf

<?php 
$date = '9/6/2013';

    list($month,$day,$year) = sscanf($date, '%d/%d/%d');

    $date = sprintf('%d-%02d-%02d',$year,$month,$day);

echo $date;
?>
于 2013-09-06T13:07:36.373 回答