PHP strtotime() 看起来需要欧元格式

发布于 2024-08-20 13:25:49 字数 532 浏览 6 评论 0原文

我一直在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清浅ˋ旧时光 2024-08-27 13:25:49

- 表示 ISO 日期:

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

The - indicates an ISO Date:

03-02-01  => 1. february 2003 (ISO)
01.02.03  => 1. february 2003 (European)
02/01/03  => 1. february 2003 (US)
懒的傷心 2024-08-27 13:25:49

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.

夏见 2024-08-27 13:25:49

我遇到了这个问题,并通过按照您的建议进行解决 - 在用户输入的日期上执行 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 prevents strtotime from using an ISO date and solves the problem.

浅忆流年 2024-08-27 13:25:49

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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文