Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别日期格式并在php中转换为ISO日期_Php_Date - Fatal编程技术网

识别日期格式并在php中转换为ISO日期

识别日期格式并在php中转换为ISO日期,php,date,Php,Date,目标:将任何本地日期转换为相应的ISO日期 我的做法: 优点:可以很好地转换很多格式 缺点/问题:转换显然不是日期的字符串和数字。例如 strftime("%Y-%m-%d",strtotime("A")) => 2012-10-29 strftime("%Y-%m-%d",strtotime("1")) => 1970-01-01 问题: 是否有更好的方法来识别日期并将其转换为ISO日期? 您知道有任何库/正则表达式能够在php中实现这一功能吗? 我认为,当面临诸如2012年6月

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

我的做法:

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

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

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

是否有更好的方法来识别日期并将其转换为ISO日期? 您知道有任何库/正则表达式能够在php中实现这一功能吗?
我认为,当面临诸如2012年6月5日这样的日期时,问题会真正出现,因为不清楚您是在处理6月5日还是5月6日的问题,您可能会从以DD-MM-YYYY为标准的欧洲国家获取信息

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

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

还需要注意的是,Mysql如果这是数据的标题,那么它在日期字段中的输入、delimeters、前导零的缺失等方面也非常宽松。但是,您仍然需要获得正确的Y-M-D顺序,这样它才有机会


我想最终的答案是不允许对日期输入自由文本,但给它们选择符-但当然你可能无法影响即将到来的日期…

我认为当你面对诸如2012年6月5日这样的日期时,问题真的会出现,因为不清楚你是否在处理6月5日,或者5月6日,你可以从欧洲国家获取信息,在那里DD-MM-YYYY是标准

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

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

还需要注意的是,Mysql如果这是数据的标题,那么它在日期字段中的输入、delimeters、前导零的缺失等方面也非常宽松。但是,您仍然需要获得正确的Y-M-D顺序,这样它才有机会

我想最终的答案是不允许对日期进行自由文本输入,但给它们选择符——当然,您可能无法影响传入的日期……

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

出于许多原因,我不喜欢这个函数,但它确实能够合理地解决问题,因为输入了一个未知日期格式的字符串

然而,即使strotime尽了最大的努力也永远不够,因为任意的日期格式都是不明确的

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

简单的事实:这是不可能的

如果你想让你的约会在任何意义上都是可靠的,你必须放弃你可以接受任意输入格式的想法

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

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

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

PHP的strotime函数已经尽了最大努力尝试获取任意字符串并确定其日期格式

出于许多原因,我不喜欢这个函数,但它确实能够合理地解决问题,因为输入了一个未知日期格式的字符串

然而,即使strotime尽了最大的努力也永远不够,因为任意的日期格式都是不明确的

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

简单的事实:这是不可能的

如果你想让你的约会在任何意义上都是可靠的,你必须放弃你可以接受任意输入格式的想法

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

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


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

ok。1/2/3是多少?2013年2月1日?1月3日,第二年?自动检测是一个很好的选择,但你也可以随身携带一些自动桶,当系统阻塞和呕吐的时候,你的应用程序就会被自动桶堵塞。基本上,strotime是你能得到的最好的了,但它仍然不是那么好。也许在把任何东西都输入strotime之前做一些基本的输入验证,希望它不会吐出来?你的$date变量是一个黑盒子。很难回答这个问题。@hakre这对我来说也是个黑匣子。它是用户导入的excel或csv文件。它可以包含任何类型的日期格式。我知道要找到一个完美的解决方案几乎是不可能的,所以我只是在寻找一个比我已经拥有的更好的解决方案:不是不可能的。但实际上不可能。对不起;事情就是这样。1/2/3是多少?2013年2月1日?1月3日,第二年?自动检测是一个很好的选择,但你也可以随身携带一些自动桶,当系统阻塞和呕吐的时候,你的应用程序就会被自动桶堵塞。基本上,strotime是你能得到的最好的了,但它仍然不是那么好。也许在把任何东西都输入strotime之前做一些基本的输入验证,希望它不会吐出来?你的$date变量是一个黑盒子。很难回答这个问题。@hakre这对我来说也是个黑匣子。它是用户导入的excel或csv文件。它可以包含任何类型的日期格式。我知道要找到一个完美的解决方案几乎是不可能的,所以我只是在寻找一个比我已经拥有的更好的解决方案:不是不可能的。但实际上不可能。对不起;事情就是这样。
strftime("%Y-%m-%d",strtotime("A")) => 2012-10-29
strftime("%Y-%m-%d",strtotime("1")) => 1970-01-01