PHP strtotime() 看起来需要欧元格式
我一直在使用 PHP 的 strtotime() 方法来接受表单上的日期字段。我喜欢它的强大功能,因为它接受“明天”、“下周四”或(据说)任何日期表示并将其转换为 Unix 时间戳。
直到昨天为止,它一直运行良好。有人输入“2-4-10”,结果记录的不是 2010 年 2 月 4 日,而是 2002 年 4 月 10 日!因此它期望 YMD 而不是 MDY。
我认为问题可能只是使用了两位数的年份,所以我们再次尝试使用“2-4-2010”。记录日期为 2010 年 4 月 2 日!那时我只是不明白 strtotime() 在做什么。 PHP.net 表示需要美国英语日期格式。那么为什么它会假设DMY呢?
有办法解决这个问题吗?或者我必须停止使用 strtotime() 吗?
注意:我刚刚做了一个测试。当您使用斜杠而不是连字符/破折号时,即使使用 2/4/10,它也可以正常工作。这到底为什么重要?如果这就是全部,我应该在表单输入上运行 str_replace("-", "/", $input) 然后再将其传递给 strtotime() 吗?
I've been using PHP's strtotime() method to accept a date field on a form. I love how powerful it is, in how it will accept "Tomorrow", "Next Thursday", or (supposedly) any date representation and convert it to the Unix timestamp.
It's been working great -- until yesterday. Someone entered "2-4-10" and instead of logging Feb 4th, 2010, it logged April 10, 2002! So it expected Y-M-D instead of M-D-Y.
I thought maybe the problem was just using a 2-digit year, so we tried again with "2-4-2010". That logged April 2nd, 2010! At that point I just don't understand what strtotime() is doing. PHP.net says it expects a US English date format. Why then would it assume D-M-Y?
Is there a way around this? Or do I have to stop using strtotime()?
Note: I just now did a test. When you use slashes instead of hyphen/dashes, it works fine, even with 2/4/10. Why on earth does that matter? And if that's all it is, should I just run str_replace("-", "/", $input) on the form input before passing it to strtotime()?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
- 表示 ISO 日期:
The - indicates an ISO Date:
strtotime()
的行为很大程度上基于 GNU 日期输入 格式规范。但尽管它很强大,但我们不应该指望它能读心术。允许自由格式的用户日期输入会带来永久的麻烦。The behavior of
strtotime()
is based largely on the GNU date input formats spec. But as powerful as it is, it shouldn't be expected to read minds. Allowing free-form user date input is asking for perpetual trouble.我遇到了这个问题,并通过按照您的建议进行解决 - 在用户输入的日期上执行
str_replace
以将破折号替换为斜杠。这可以防止 strtotime 使用 ISO 日期并解决问题。I had this problem and solved it by doing exactly what you suggested - do a
str_replace
on the user-entered date to replace the dashes with slashes. This preventsstrtotime
from using an ISO date and solves the problem.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,那么就没有知道他们的预定日期是什么的方法)。
strtotime is by its very nature fuzzy, so you can't assume that it will always do what you want. If you enter 2010-04-02 then you would expect that to return 2nd April 2010, which is what strottime is trying to do. Running an str_replace from hyphens to slashes might mean that people entering in that format get the wrong date.
If you're running PHP 5.3 or above, consider date_parse_from_format() or for PHP 5.1 and above on Unix consider strptime(). Both functions take a format, so remove potential ambiguity (if you tell users what format you are expecting - if you're running an international site and have a text box labelled date which the user enters 2/4/2010 into then there is no way to know what their intended date is).