我一直在使用PHP的strtotime()方法接受表单上的日期字段。我喜欢它有多强大,它将如何接受“明天”,“下周四”或(据说)任何日期表示并将其转换为Unix时间戳。
一直很好 - 直到昨天。有人进入“2-4-10”而不是记录2010年2月4日,它记录在2002年4月10日!所以它期望Y-M-D而不是M-D-Y。
我想也许问题只是使用了两位数的年份,所以我们再次尝试使用“2-4-2010”。记录在2010年4月2日!那时我只是不明白strtotime()正在做什么。 PHP.net表示它希望采用美国英语日期格式。为什么它会假设D-M-Y?
有解决方法吗?或者我是否必须停止使用strtotime()?
注意:我刚才做了一个测试。当你使用斜杠而不是连字符/短划线时,它工作正常,即使是2/4/10。为什么这个重要?如果就是这样,我应该在表单输入上运行str_replace(“ - ”,“/”,$ input),然后再将其传递给strtotime()吗?
答案 0 :(得分:7)
- 表示ISO日期:
03-02-01 => 1. february 2003 (ISO)
01.02.03 => 1. february 2003 (European)
02/01/03 => 1. february 2003 (US)
答案 1 :(得分:6)
strtotime()
的行为主要基于GNU date input格式规范。但是,尽管它本身是强大的,但不应该期望读出思想。允许自由格式的用户日期输入要求永久性的麻烦。
答案 2 :(得分:1)
我遇到了这个问题并通过完全按照您的建议解决了问题 - 在用户输入的日期执行str_replace
以用斜线替换短划线。这可以防止strtotime
使用ISO日期并解决问题。
答案 3 :(得分:0)
strtotime本质上是模糊的,所以你不能认为它会永远做你想要的。如果您输入2010-04-02,那么您可能希望返回2010年4月2日,这是strottime尝试做的事情。从连字符到斜杠运行str_replace可能意味着以该格式输入的人得到错误的日期。
如果您运行的是PHP 5.3或更高版本,请考虑使用date_parse_from_format()或在Unix上使用PHP 5.1及更高版本来考虑strptime()。这两个函数都采用一种格式,因此消除了潜在的歧义(如果您告诉用户您期望的格式 - 如果您正在运行国际网站并且有一个标记为日期的文本框,用户将于2010年2月4日进入,那么就没有知道他们的预期日期的方式。)