PHP中日期格式之间的转换
我有一个需要用户输入日期的Web,然后将其存储在MySQL数据库中。我希望用户以m/d/yyyy格式输入日期,并让系统将其转换为MySQL所需的Y-m-d格式。我认为这很简单,但我不能让它停止犯严重错误 我尝试了以下方法:PHP中日期格式之间的转换,php,date,format,date-formatting,Php,Date,Format,Date Formatting,我有一个需要用户输入日期的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 = 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);
这也做了同样的事情——一个月和日期的转换
有谁能帮我找出我做错了什么,或者如何更好地进行转换。您应该使用非标准格式您应该使用非标准格式您应该使用
来自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');
你应该使用
来自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');
您可以通过以下方式指定提供数据的格式:
$date = DateTime::createFromFormat('j/n/Y', '9/6/2013');
您可以通过以下方式指定提供数据的格式:
$date = DateTime::createFromFormat('j/n/Y', '9/6/2013');
此示例不仅适用于这种情况,而且在许多其他地方也很有用,例如从数学家那里获取信息,在您的站点文本框中输入二次方程,而不使用正则表达式 或者可以正确处理驾驶执照号码并将其存储在数据库中,使用
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;
?>
此示例不仅适用于这种情况,而且在许多其他地方也很有用,例如从数学家那里获取信息,在您的站点文本框中输入二次方程,而不使用正则表达式 或者可以正确处理驾驶执照号码并将其存储在数据库中,使用
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;
?>
不要使用直接的日期时间,而是使用静态方法,指定日期字符串的格式可能一切正常,但mysql使用错误(欧洲)格式?您是否尝试保存日期并再次检索它?不要使用直接的日期时间,而是使用静态方法指定日期字符串的格式。也许一切都很好,但您的mysql使用了错误的(欧洲)格式?您是否尝试保存日期并再次检索它?您应该使用n
表示月份,使用j
表示日期。否则,格式中应使用前导零。在您的评估中看不到任何问题。您需要交换j
和n
,因此格式将相等:)@Baba我对此有一个严格的规则:如果(in_数组($drink,$alcohold))出口()
实际上,我似乎已经解决了这个问题,解决方案比想象的要简单得多。我在使用JQuery UI DatePicker时,没有注意到它是以2013年6月9日而不是2013年6月9日的格式输出日期,因此,您建议的消除歧义是问题的核心。当我将其更正为使用sl时灰烬而不是破折号,我发现以下操作非常有效:$this->vital\u date=date(“Y-m-d”,strotime($this->vital\u date));
--简单的一行代码。非常感谢,你真的让我思考了这一行的所有方面。你应该使用n
表示月份,使用j
表示日期。否则格式中会出现前导零。在你的评估中看不到任何问题。你需要交换j
和n
,因此格式将是相等的:)@爸爸,我对此有一个严格的规则:if(in_数组($drink,$alcohold))exit()事实上,我似乎已经解决了这个问题,解决方案比想象的要简单得多。我正在使用JQuery UI日期选择器,但没有注意到它是以2013年6月9日而不是2013年6月9日的格式输出日期,因此,您建议的消除歧义是问题的核心。当我纠正这一点,使用斜杠而不是破折号时,我发现以下操作非常有效:$this->vital_date=date(“Y-m-d”,strotime($this->vital_date))代码>--一个简单的单行程序。非常感谢,你真的让我思考了这个问题的方方面面。