我有一个Web,要求用户输入一个日期,然后存储在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);
这也做了同样的事情 - 转换了月份和日期。
任何人都可以帮我解决我做错了什么或如何做出更好的转换。
答案 0 :(得分:3)
您应该使用DateTime::createFromFormat
来自PHP DOC
通过查看各个组件之间的分隔符来消除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');
答案 1 :(得分:1)
您应该将DateTime::createFromFormat用于非标准格式
答案 2 :(得分:1)
您可以通过以下方式指定提供数据的格式:
$date = DateTime::createFromFormat('j/n/Y', '9/6/2013');
答案 3 :(得分:0)
此示例不仅对这种情况很明显,而且在许多其他地方甚至也是有用的,例如从数学家那里获取信息在您的站点文本框中输入二次方程式而不使用正则表达式
或驾驶执照号码可以正确处理并存储在数据库中,使用scanf
格式化,例如scanf($input, '%s-%s-%d/%d)
;等等
这取决于您的需求,因此您必须了解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;
?>