使用PHP在MySQL中保存意外时间格式的最安全方法

时间:2010-12-09 13:55:47

标签: php mysql datetime date-format

我必须收集不同格式的日期并将它们保存在MySQL Filed Date(我估计是YYYY-MM-DD)中,那么如何更改格式,如12/24 / 2010,24 / 12/2010 ,12-10-2010和PHP这样的东西?

我知道有mktimestrtotime但我怎么能安全地做到这一点?

更新:从准确的角度来看是安全的! :)

4 个答案:

答案 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));