2010-02-05 92 views
7

我一直在使用PHP的strtotime()方法接受窗体上的日期字段。我喜欢它有多强大,它将如何接受“明天”,“下周四”或(据说)任何日期表示,并将其转换为Unix时间戳。PHP strtotime()看起来像它期待欧元格式

它一直在努力 - 直到昨天。有人进入“2-4-10”,而不是记录2010年2月4日,它记录了2002年4月10日!所以它期望Y-M-D而不是M-D-Y。

我想也许问题只是使用了2位数的年份,所以我们再次尝试使用“2-4-2010”。这记录2010年4月2日!那时我只是不明白strtotime()在做什么。 PHP.net表示它期望美国英文日期格式。那么为什么会假设D-M-Y?

有没有办法解决这个问题?或者我必须停止使用strtotime()?

注:我刚才做了一个测试。当你使用斜杠代替连字符/破折号时,即使在2/4/10时也可以正常工作。为什么地球上这很重要?如果就是这样,我应该在将表单输入传递给strtotime()之前,先运行str_replace(“ - ”,“/”,$ input)吗?

+1

是的,试图用strtotime处理日期之前用某种方式规范日期对我来说似乎是一个好主意。 – JAL 2010-02-05 13:46:40

+0

只要等到你尝试使用strtotime解析*次*,那么你就会有一些真正的乐趣。 (Think timezone,DST等) – 2010-10-12 16:04:14

回答

7

的 - 表示ISO日期:

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

strtotime()的行为主要是基于GNU date input格式规范。但是,尽管强大,但不应期望读懂头脑。允许自由形式的用户日期输入是要求永久的麻烦。

+0

+1最后一句话非常重要。 – alex 2012-03-04 12:06:00

1

我有这个问题,并通过完全按照您的建议进行解决 - 在用户输入的日期执行str_replace以用斜杠替换破折号。这可以防止strtotime使用ISO日期并解决问题。

0

strtotime本质上是模糊的,所以你不能认为它会一直做你想做的。如果你输入2010-04-02,那么你会期望返回2010年4月2日,这是strottime试图做的。从连字符到斜线运行str_replace可能意味着输入该格式的人会得到错误的日期。

如果您运行的是PHP 5.3或更高版本,请考虑date_parse_from_format()或对于Unix上的PHP 5.1及更高版本考虑strptime()。这两种功能都采用格式,因此可以消除潜在的歧义(如果您告诉用户您期望的格式 - 如果您运行的是国际站点并且有用户输入2/4/2010的文本框标记的日期,则不存在方式知道他们的预期日期是什么)。

相关问题