目标:将任何本地日期转换为相应的ISO日期
我的方法: http://codepad.viper-7.com/XEmnst
strftime("%Y-%m-%d",strtotime($date))";
上行:很好地转换了很多格式
下行/问题:转换显然不是日期的字符串和数字。 E.g。
strftime("%Y-%m-%d",strtotime("A")) => 2012-10-29
strftime("%Y-%m-%d",strtotime("1")) => 1970-01-01
问题:
答案 0 :(得分:4)
PHP的strtotime()
函数已尽最大努力尝试获取任意字符串并计算出它的日期格式。
我不喜欢这个功能有很多原因,但考虑到一串未知的日期格式作为输入,它确实做了一些合理的工作。
然而,即使strtotime()
的最佳努力也是不够的,因为任意日期格式都不明确。
无法判断05-06-07
是2007年6月5日还是2007年5月6日。甚至是2005年6月7日(是的,有些人会写这样的日期)。< / p>
简单明了的事实:这是不可能的。
如果您希望您的日期在任何意义上都是可靠的,那么您必须放弃您能够接受任意输入格式的想法。
[编辑] 您在评论中说输入来自各种Excel和CSV文件。
唯一的希望就是每个文件本身是否一致。如果您知道来自给定源的文件将具有给定的输入格式,则可以为导入的每种文件类型编写自定义包装,并为该格式处理它。这是我过去自己使用的解决方案,只要您可以预测正在处理的文件的格式,它就能正常工作。
但是,如果单个文件包含不可预测或不明确的日期,那么您就不幸了:您有一项不可能完成的任务。避免丢失数据的唯一方法是回复文件供应商并要求他们修复数据。
答案 1 :(得分:0)
我认为当面对日期(例如6月6日至6日)时,如果不清楚您是在处理6月5日或5月6日,并且您可能会收到来自欧洲国家的DD MM YYYY是规范。
如果您只分析一个输入字段,那么您可能有机会检测到分界符并将字符串拆分以查找可能看起来像真实日期的内容。
在这种情况下,PHP函数checkdate可能会作为最后一次双重检查而派上用场。
还要注意Mysql(如果这是数据的标题)对于它将放入DATE字段的内容,分界符,缺少前导零等也非常宽容。但是,你仍然必须得到YMD命令纠正它有机会。
我认为最终的答案是禁止日期的自由文本输入,但给他们拣货 - 但当然你可能无法影响收到的日期......