我必须收集不同格式的日期并将它们保存在MySQL Filed Date
(我估计是YYYY-MM-DD)中,那么如何更改格式,如12/24 / 2010,24 / 12/2010 ,12-10-2010和PHP这样的东西?
我知道有mktime
,strtotime
但我怎么能安全地做到这一点?
更新:从准确的角度来看是安全的! :)
答案 0 :(得分:2)
你不能:考虑到2010年11月9日的mm / dd / yy v yy / mm / dd v dd / mm / yy。
你需要知道他们事先做过的格式。没有一次性的解决方案。
答案 1 :(得分:2)
...格式如12/24 / 2010,24 / 12/2010 ......
此处的基本问题是,dd/mm/yyyy
通常与mm/dd/yyyy
无法区分。
如果你得到11/12/2010
,你怎么知道它应该是哪种格式? strtotime()
无法帮助您。
如果你打算使用strtotime()
,那么值得指出的是,如果你给它11/12/2010
(即使用斜杠分隔符),它会将其视为mm/dd/yyyy
,但是如果你给它11-12-2010
(破折号分隔符),它会将其视为dd-mm-yyyy
。但是因为这两种格式通常都是双向编写的,所以这种区别不仅毫无意义,而且实际上使strtotime()
函数对于实际使用来说太不可预测了。
如果您已经知道任何特定传入日期字符串的格式,那么最好的方法是使用preg_match()
或类似字符串将其拆分为组件部分,然后使用mktime()
重新构建它。
如果您不知道用户想要的格式,那么您可以猜测,但如果它含糊不清,那么您总是有机会弄错。
如果这是来自网站输入表单,建议您最好在Javascript中提供一个前端控件,该控件始终以已知格式(最好是yyyy-mm-dd
)发送日期,从而删除任何可能含糊不清。
如果数据来自您无法控制的其他来源,并且您获得了模棱两可的输入,那么您需要接受以下任何一项错误信息。时间,或要求最终用户/数据提供者澄清他们的意思。
答案 2 :(得分:0)
如果您已经掌握了约会日期,那么您可能需要做很多工作,但如果必须收集它,您可以轻松强制执行标准表格
Month : [ ] / Day : [ ] / Year : [ ]
然后通过PHP中的mktime / date构建日期
但是如果你已经掌握了数据,你可能必须制定一些规则来标记奇怪的数据,因为strtotime()将根据你的语言环境工作(法语和英语日期不是以相同的方式编写即:法语日期dd / mm / YYYY和英文mm / dd / YYYY)。
您必须定义要使用的格式,并标记所有不适合手动返工的数据
ie:12/24/2010(完全有道理的英文日期格式,但那将是12/12/2011法语(注意年份变化))。
编辑:
以下是转换之前审核日期的开始:
<?php
$dates = array('12-12-2010', '24-12-2010','12-24-2010','12-24-10','24-12-10',
'12-12-10','12/12/2010','24/12/2010','12/24/2010', '12/24/10',
'24/12/10', '12/12/10','2010-12-12', '2010-24-12','2010-12-24',
'10-12-24','10-24-12','10-12-12','2010/12/12','2010/24/12',
'2010/12/24', '10/12/24','10/24/12','10/12/12','11-11-2011');
$regEx = array('YYYY-MM-DD' => '/^(19|20)\d\d[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])$/',
'MM-DD-YYYY' => '/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((19|20)\d\d)$/',
'DD-MM-YYYY' => '/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](\d\d)$/',
'YY-MM-DD' => '/^\d\d[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])$/',
'MM-DD-YY' => '/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](\d\d)$/',
'YY-DD-MM' => '/^\d\d[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])$/',
'No Match' => '//' );
echo '<table style="table-layout:fixed;width:400px">';
echo '<tr>'.'<th>'.'Date'.'</th>'.'<th>'.'PATTERN'.'</th>'.'</tr>';
foreach($dates as $date){
echo '<tr>';
echo '<td>';
echo $date . ' ';
echo '</td>'.'<td>';
foreach($regEx as $name=>$pattern)
if(preg_match($pattern, $date)){
echo $name;
break;
}
echo '</td>';
echo '</tr>';
} 回声''; ?&GT;
将为您提供类似
的表格+-------------+-------------+
| Date | PATTERN |
+-------------+-------------+
| 12-12-2010 | MM-DD-YYYY |
| 24-12-2010 | No Match |
| 12-24-2010 | MM-DD-YYYY |
| 12-24-10 | MM-DD-YY |
+-------------+-------------+
从那个角度来看,有一种方法可以继续建立你的子串来抓住正确的部分
答案 3 :(得分:0)
你可以尝试以下情况,如果你真的需要(尽量避免它,其他人说明原因):
$mysql_timestamp = date("Y-m-d",strtotime($unknown_timestamp));