2

目标:将任何本地日期转换为相应的 ISO 日期

我的方法: http ://codepad.viper-7.com/XEmnst

strftime("%Y-%m-%d",strtotime($date))";

优点:可以很好地转换很多格式

缺点/问题:转换显然不是日期的字符串和数字。例如

strftime("%Y-%m-%d",strtotime("A")) => 2012-10-29
strftime("%Y-%m-%d",strtotime("1")) => 1970-01-01

问题:

  1. 有没有更好的方法来识别日期并将其转换为 ISO 日期?
  2. 您知道任何能够在 php 中执行此操作的库/正则表达式吗?
4

2 回答 2

4

PHP 的strtotime()函数已经尽最大努力尝试获取任意字符串并计算出它的日期格式。

出于多种原因,我不喜欢这个函数,但它确实可以合理地解决问题,因为输入的是未知日期格式的字符串。

然而,即使strtotime()是最好的努力也永远不够,因为任意日期格式都是模棱两可的。

无法判断05-06-07是 2007 年 6 月 5 日还是 2007 年 5 月 6 日。甚至是 2005 年 6 月 7 日(是的,有些人确实会这样写日期)。

简单明了的事实:这是不可能的。

如果您希望您的日期以任何有意义的方式可靠,您必须放弃您将能够接受任意输入格式的想法。

[编辑] 您在评论中说输入来自各种 Excel 和 CSV 文件。

您唯一的希望是这些文件中的每一个是否本身都是一致的。如果您知道来自给定源的文件将具有给定的输入格式,则可以为您导入的每种文件类型编写自定义包装器,并针对该格式对其进行处理。这是我过去自己使用过的解决方案,只要您可以预测正在处理的文件的格式,它就可以工作。

但是,如果单个文件包含不可预测或不明确的日期,那么您就不走运了:您有一项不可能完成的任务。避免不良数据的唯一方法是回击文件供应商并要求他们修复数据。

于 2012-10-29T16:35:13.353 回答
0

我认为当面对诸如 2012 年 6 月 5 日之类的日期时,问题确实会出现,当您不清楚您是在处理 6 月 5 日还是 5 月 6 日时,您可能会从以 DD MM YYYY 为标准的欧洲国家获取输入。

如果您只分析一个输入字段,那么您可能有机会检测分隔符并将字符串拆分以寻找可能看起来像真实日期的内容。

在这种情况下,PHP 函数checkdate可能会作为最后的双重检查派上用场。

另请注意,Mysql(如果这是数据的方向)对于将放入 DATE 字段、分隔符、没有前导零等的内容也非常宽松。但是,您仍然必须正确获取 YMD 顺序让它有机会。

我想最终的答案是不允许日期的自由文本输入,但给他们选择器 - 但当然你可能无法影响传入的日期......

于 2012-10-29T15:26:47.380 回答