7

我一直在使用 PHP 的 strtotime() 方法来接受表单上的日期字段。我喜欢它的强大功能,它如何接受“明天”、“下周四”或(据说)任何日期表示并将其转换为 Unix 时间戳。

它一直工作得很好——直到昨天。有人输入“2-4-10”,而不是记录 2010 年 2 月 4 日,而是记录 2002 年 4 月 10 日!所以它期望 YMD 而不是 MDY。

我认为问题可能只是使用 2 位数的年份,所以我们再次尝试使用“2-4-2010”。记录在 2010 年 4 月 2 日!那时我只是不明白 strtotime() 在做什么。PHP.net 说它需要美国英语日期格式。那为什么它会假设DMY?

有没有解决的办法?还是我必须停止使用 strtotime()?

注意:我刚刚做了一个测试。当您使用斜杠而不是连字符/破折号时,它可以正常工作,即使是 2/4/10。为什么这很重要?如果仅此而已,我是否应该在将表单输入传递给 strtotime() 之前在表单输入上运行 str_replace("-", "/", $input)?

4

4 回答 4

7

- 表示 ISO 日期:

03-02-01  => 1. february 2003 (ISO)
01.02.03  => 1. february 2003 (European)
02/01/03  => 1. february 2003 (US)
于 2010-02-05T13:43:11.940 回答
6

的行为strtotime()主要基于GNU 日期输入格式规范。但尽管它很强大,但不应该指望它能读心。允许自由格式的用户日期输入是在自找麻烦。

于 2010-02-05T13:56:30.763 回答
1

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

于 2010-04-14T01:37:09.310 回答
0

strtotime 本质上是模糊的,所以你不能假设它总是会做你想做的事。如果您输入 2010-04-02,那么您会期望它返回 2010 年 4 月 2 日,这就是 strotime 正在尝试做的事情。从连字符到斜杠运行 str_replace 可能意味着以该格式输入的人会得到错误的日期。

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

于 2010-10-12T15:58:14.537 回答