我已经使用PHP的strtotime()法接受的一个新领域上的一种形式。我爱它是多么强大,它将如何接受的"明天","Next Thursday",或者(应)的任何日期的表示,并将其转换为Unix时间戳。

这是伟大的工作--直到昨天。有人进入"图2-4-10"和而不是记录月4日,2010年,它登录月10,2002年!因此它预期Y-M-D,而不是M-D-Y.

我想也许这个问题只是使用一个2位数字的年份,所以我们又试了一次以"2-4-2010".记录月2日,2010年!在这一点上,我只是不明白什么strtotime()正在做的事情。PHP.net 说它需要一个英文的日期格式。为什么然后将它假设的D-我的?

有没有办法绕过这个?或者我必须停止使用strtotime()?

注: 我只是现在没有一个测试。当你使用斜线而不是连字符/破折号,它工作得很好,甚至与2/4/10.为什么地球上不会这件事吗?如果这一切是说,我是不是应该运行str_replace("-", "/", $输入)的形式输入之前将它传递给strtotime()?

有帮助吗?

解决方案

在 - 表示ISO日期:

03-02-01  => 1. february 2003 (ISO)
01.02.03  => 1. february 2003 (European)
02/01/03  => 1. february 2003 (US)

其他提示

行为 strtotime() 在很大程度上是基于的 GNU输入的日期 格式规格。但是作为强大的,因为它是,它不应该以预期的读心术。允许自由形式的用户输入的日期是要求用于永久麻烦。

我有这个问题,做你的建议正是解决了这个问题 - 做用户输入的日期str_replace用斜杠来代替破折号。这防止使用ISO日期strtotime和解决该问题。

的strtotime是由于其本身的性质模糊,所以你不能假设它会永远做你想做的。如果输入2010-04-02,那么你会期望返回第2 2010年4月,这是strottime正在尝试做的。从运行到连字符的斜线str_replace函数可能意味着进入该格式的人得到错误的日期。

如果你正在运行PHP 5.3或以上,考虑date_parse_from_format()或PHP 5.1和以上在Unix考虑strptime()。这两个函数需要的格式,所以消除潜在的不确定性(如果你告诉用户你期待什么样的格式 - 如果你正在运行的国际网站,并具有用户输入2/4/2010到那么有没有一个文本框标记日期办法知道他们的预期日期是什么)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top