代码之家  ›  专栏  ›  技术社区  ›  rhodesjason

php strtotime()似乎需要欧元格式

  •  7
  • rhodesjason  · 技术社区  · 14 年前

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

    它一直工作得很好——直到昨天。有人进入“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)吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   Morfildur    14 年前

    -表示ISO日期:

    03-02-01  => 1. february 2003 (ISO)
    01.02.03  => 1. february 2003 (European)
    02/01/03  => 1. february 2003 (US)
    
        2
  •  6
  •   GZipp    14 年前

    行为 strtotime() 主要基于 GNU date input 格式规范,但尽管它很强大,但它不应该被期望去阅读思想。允许自由格式的用户输入日期是在要求永久性的麻烦。

        3
  •  1
  •   Clayton    14 年前

    我遇到了这个问题,我按照你的建议解决了它——做一个 str_replace 在用户输入的日期用斜线替换破折号。这防止 strtotime 使用ISO日期并解决问题。

        4
  •  0
  •   thelem    14 年前

    strtotime本质上是模糊的,所以你不能假设它总是做你想做的事情。如果您进入2010-04-02,那么您将期望返回2010年4月2日,这是斯特罗提姆正在努力做的。运行从连字符到斜线的str_replace可能意味着以这种格式输入的人会得到错误的日期。

    如果您运行的是php 5.3或更高版本,那么可以考虑在Unix上从\u format()或php 5.1及更高版本进行日期分析,并考虑strptime()。这两个函数都采用一种格式,因此消除了潜在的歧义(如果您告诉用户您期望的格式-如果您正在运行一个国际站点,并且有一个文本框标记用户输入2/4/2010的日期,那么就无法知道他们的预期日期)。