【问题标题】:strtotime with year in 2 digit formatstrtotime 年份为 2 位数字格式
【发布时间】:2010-09-02 10:07:55
【问题描述】:

你好,有人可以用非标准格式解释 strtotime 函数的行为。

echo date("d-m-Y",strtotime('02-12-10')) .'<br>'; //10-12-2002
echo date("d-m-Y",strtotime('09.09.10')) .'<br>'; //02-09-2010 --How this is interpreted?


echo date("d-m-Y",strtotime('02-12-2010')) .'<br>'; //02-02-2010
echo date("d-m-Y",strtotime('09.09.2010')) .'<br>'; //09-09-2010

我想将 dd.mm.yy(09.09.10) 格式的字符串转换为日期时间格式。

【问题讨论】:

    标签: php


    【解决方案1】:

    strtotime() 在这种情况下可能有点不稳定。它旨在识别标准的美国日期格式。

    如果您可以使用 PHP > 5.3,请考虑使用DateCreateFromFormat,它具有接受预定义格式字符串来解析传入数据的巨大优势。

    在 5.3 之前的平台上,strptime() 似乎提供了第二好的选择。它在 Windows 上不可用,并且有一些小问题 - 请务必在使用前阅读手册页。

    【讨论】:

    • 我在建筑方面不同意这个答案。非标准日期几乎总是应该首先被标准化,尝试将它们解析成更可用的形式,并且如果可能的话,由提交者验证为正确。
    • @hopeseekr 定义“标准”。在我的祖国德国,“09.09.10”是一种有效的格式,意思是 2010 年 9 月 9 日。反对转换它的原因是 - 例如从用户输入 - 直接到时间戳,而不是使用繁琐的字符串操作使其首先成为 ISO 日期?对我来说毫无意义。
    • @Pekka,即使是 PHP 手册也有关于 strptime() 的重大警告。它说改用us.php.net/manual/en/function.date-parse-from-format.php
    • @hopeseekr 仔细查看我的答案,这也是我推荐的第一件事。它并不总是一种选择,因为它是 PHP > 5.3
    • @Lucky 给自己弄了一个日历,然后非常努力地查看“二月”页面。注意到什么了吗? :D
    【解决方案2】:

    来自manual

    “日、月和两位数年份,带点或制表符”格式(dd [.\t] mm "." yy)仅适用于年份值 61(含)到 99 (含) - 在那些年份之外,时间格式“HH [.:] MM [.:] SS”具有优先权。

    您正在使用'09.09.10' 并且 10 不在有效范围内,因此将分隔符更改为 -

    【讨论】:

    • 感谢您的回复和解释。由于我是 PHP 新手,如果您能解释一下原因,那就太好了, echo date("d-m-Y",strtotime('02-12-10')) 会导致 10-12-2002 而不是 02-12-2010
    • @lucky 当strtotime 不明确时(= 当所有成员只有两位数时),它将恢复为 Y-m-d。我认为你对此无能为力。您需要使用可以强制启用模式的解析功能,或手动分解日期,如 Col. Shrapnel 所示。
    【解决方案3】:

    这不是 2 位数年份问题。 这是非标准格式问题。
    并从仅仅一个程序中提出不可能的事情。
    即使是我,不是计算机,也不知道这些 09 的 doo 在你的约会中意味着什么。是day.month.year 吗?或year.month.day 或其他什么?
    假设它是day.month.year

    $list($d,$m,$y) = explode("09.09.10");
    echo "$d-$m-20$y";
    

    【讨论】:

    • 这是标准的德语格式。 sql-server-helper.com/tips/date-formats.aspx 。请在标准德语下检查。这里是 09.09.10。代表 2010 年 9 月 9 日。此外,我并没有从程序中要求不可能的事情。
    • @lucky 好吧,它是本地 mssql 标准。但是还有许多其他标准,没有人能确定这里指的是哪一个。实际上,strtotime() 旨在识别不可解析的口头日期格式。将它用于这种正式的格式是矫枉过正的。我会使用我提供的代码并继续前进,而不是寻找正义的日子
    • 这没有意义。 99年你会做什么
    • @AlperAKPINAR 这就是我在回答中的字面意思。
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多