2010-09-02 52 views
2

有人可以有人解释一年的非标准格式strtotime函数的行为。strtotime与2位数字格式的年份

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)的字符串转换为日期时间格式。

回答

6

strtotime()可以是在这种情况下有点片状。它旨在识别标准的美国日期格式。

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

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

+0

我不同意这个建筑理由的答案。非标准日期应该几乎总是首先被标准化,**在尝试将它们解析为更多可用的形式之前,并且如果可能的话,由提交者验证为正确。 – 2010-09-02 11:30:38

+3

@hopeseekr定义“标准”。在我的祖国德国,“09.09.10”是一种有效格式,意思是2010年9月9日。从用户输入 - 直接转换为时间戳*,而不是使用繁琐的字符串操作使其首次成为ISO日期?对我没有意义。 – 2010-09-02 11:34:09

+0

@Pekka,甚至PHP手册对strptime()都有很大的警告。它说要使用http://us.php.net/manual/en/function.date-parse-from-format.php代替。 – 2010-09-02 11:56:01

1

这不是2位数年份问题。 这是非标准格式的问题。
从单纯的程序中提出不可能的事情。
即使我不是一台电脑,也不知道这些09的doisy在你的约会中意味着什么。是day.month.year?或者year.month.day或者其他什么?
假设它是day.month.year

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

这是标准的德国格式。 http://www.sql-server-helper.com/tips/date-formats.aspx。请检查标准德语。 09.09.10。代表2010年9月9日。此外,我不是要求程序中不可能的事情。 – satya 2010-09-03 06:17:24

+0

@lucky以及它是本地的mssql标准。但是还有很多其他的标准,没有人能够确定这里的意思。实际上,strtotime()旨在识别不可解析的文字日期格式。把它用于这样一种正式的格式是过分的。我会使用我提供的代码并继续前进,而不是寻求正义的日子 – 2010-09-03 06:59:55

3

manual

“天,月和两位数年,用点或制表符” 格式(DD [\吨]毫米 “” yy)仅适用于年份值61(含)至99(含) - 在这些年份之外,时间格式为“HH [。:] MM [。:] SS”优先。

您正在使用'09.09.10'和10不落在有效范围,因此分离器改变到-

+0

谢谢你的答复和解释。由于我是PHP新手,如果你能解释为什么, echo date(“dmY”,strtotime('02 -12-10'))会导致10-12-2002 而不是02-12- 2010 – satya 2010-09-02 10:29:00

+0

@lucky当'strtotime'有歧义(=所有成员只有两位数字时),它将恢复为Ymd。我不认为你可以做任何事情。您需要使用可以强制架构的解析函数,或者像Col Shrapnel所示手动分解日期。 – 2010-09-02 11:14:16