PHP - 具有奇怪输出的日期格式的短手if语句

时间:2010-04-29 14:01:53

标签: php

我使用if语句的简写符号来格式化字段。如果该字段是空字符串,我将其保留为空字符串,如果没有,那么我尝试将其格式化为正确的日期时间格式,以便可以将其插入到mysql数据库中。这是我的PHP代码

$date = ($date == '') ? date("Y-m-d", strtotime($date)) : $date;

由于某种原因,当$ date字符串不为空时,它将以格式'm / d / Y'格式返回:例如:04/01/2010

当我将代码拉出速记时

$date = date("Y-m-d", strtotime($date));
print($date);

它的格式正确,如'Y-m-d'或2010-04-01。有谁知道为什么会这样?感谢

5 个答案:

答案 0 :(得分:1)

我在这里试图完成你所做的一切,但你可能会有更多的运气:

$date = ($ts = strtotime($date)) ? date("Y-m-d", $ts) : '';

这将尝试解析任何传入的日期字符串,如果日期不可解析,则会失败为空字符串。

请注意,检查strtotime解析日期的能力非常重要,因为如果$ date不包含可解析日期,则date(“Ymd”,strtotime($ date))将返回1970年左右的某个日期。

e.g:

$ php -r 'var_dump(date("Y-m-d", strtotime("thisisnotadate")));'
string(10) "1970-01-01"
$ php -r 'var_dump(date("Y-m-d", strtotime("01/01/1901")));'
string(10) "1970-01-01"
$ php -r 'var_dump(date("Y-m-d", strtotime("01/01/2048")));'
string(10) "1970-01-01"
$

strtotime只能处理符合32位时间戳的日期,这会将其限制在1970 - 2038年。此外,某些日期格式可能不明确。

答案 1 :(得分:1)

您混淆了三元运算符的参数,只需切换它们,或者更改等于运算符以检查不等式:

$date = ($date !== '') ? date("Y-m-d", strtotime($date)) : $date;

答案 2 :(得分:0)

在您描述的情况下,$date必须已使用m/d/Y表示法在脚本的其他位置设置。在这种情况下,三元运算符使$date保持不变。

当您摆脱速记时,m/d/Y字符串被strtotime强制转换为时间戳,然后被Y-m-d强制转换为date()字符串。< / p>

答案 3 :(得分:0)

现在,您的陈述是:

If $date is an empty string, pass that empty string as a timestamp to the string to time function. Pass that to the date function. Otherwise return the contents of $date.

也许你打算:

$date = ($date == '') ? date("Y-m-d") : $date;

答案 4 :(得分:0)

在我看来,你正在做一些你不需要的事情(使用三元语法)。来自您的一条评论My intention is that if it is an empty string then keep it an empty string, if not then formate it using strtotime then the date function. I would need the strtotime in there to properly format it for mysql

if($date != '')  // leave it alone if it is an empty string
{
    $date = date("Y-m-d", strtotime($date));
}

重要提示 - 多年来我没有触及PHP,所以语法可能会关闭,但原理是相同的)