从mysqli返回的php中的格式日期

时间:2012-04-16 15:17:15

标签: php date mysqli

我有一个返回日期的查询,我想在将其显示给页面上的用户之前对其进行格式化。但是,当我使用格式时,日期显示为空(显示1969年)。以下是获取数据的代码:

$sql = 'SELECT u.username, td.postingText, td.createdOn, td.lastUpdated
        FROM threadDetails td, users u
        WHERE blogThreadId = ?
        AND td.userId = u.userId
        order by td.createdOn DESC';
$stmt = $conn->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('s', $blogThreadId);
$stmt->bind_result($username, $postingText, $createdOn, $lastUpdated);
$stmt->execute();
$stmt->store_result();

$numrows = $stmt->num_rows;
while ($stmt->fetch())
{
    $rowofdata=array(
        'username' => $username,
        'postingText' => $postingText,
        'createdOn' => $createdOn,
        'lastUpdated' => $lastUpdated,
    );  
    $results[] = $rowofdata;
}   
$stmt->close();

当我使用以下代码(在不同的功能中)打印出来时:

foreach ($threadData as $threadDetailItem)
{
    $msg = sprintf ("<tr>%s %s %s %s %s </tr>\n",
        "<td>" . $threadDetailItem['threadTitle'] . "</td>", 
        "<td>" . $threadDetailItem['username'] . "</td>", 
        "<td>" . $threadDetailItem['createdOn'] . "</td>", 
        "<td>" . $threadDetailItem['threadCount'] . "</td>", 
        "<td>" . $threadDetailItem['lastUpdated'] . "</td>");
    echo $msg;
}

打印出来(对于我创建的On或最后更新的字段):

2012-04-15 16:14:55

当我替换sprintf行的部分时:

        "<td>" . $threadDetailItem['createdOn'] . "</td>", 

使用:

        "<td>" . date("F j, Y, g:i a", $threadDetailItem['createdOn']) . "</td>", 

我得到了

“1969年12月31日,下午7:33”和我的phplog中的一条消息,说明遇到了一个非正确形成的数值。我需要做什么才能正确显示正确的日期?我已经尝试将sprintf从%s更改为%d,但这不起作用。

提前感谢您的建议。

3 个答案:

答案 0 :(得分:5)

这是因为$threadDetailItem['createdOn']是一个字符串,而date()函数需要一个数字时间戳。使用strtotime() PHP函数将字符串首先转换为时间戳:

date("F j, Y, g:i a", strtotime($threadDetailItem['createdOn']))

答案 1 :(得分:0)

首先必须使用strtotime函数将字符串转换为时间戳。

$date=$variable['from-database'];
date("Y-m-d",strtotime($date))

答案 2 :(得分:-1)

Php的date()函数使用unix时间戳http://en.wikipedia.org/wiki/Unix_time,而不是日期字符串。

我真的建议您更改数据库架构以使用BIGINT,并将日期信息与日期(“U”)一起存储。如果你这样做,你将使用日期和区域设置格式绕过hazzel。 您也可以使用INT,但系统可以在2038年之后处理日期。

您可以使用strtotime()函数http://se2.php.net/manual/en/function.strtotime.php

date("F j, Y, g:i a", strtotime($threadDetailItem['createdOn']))

但是,如果您的日期存储在错误的语言环境中,它将给您错误的答案。 当我说日期字符串和语言环境可能是一个真正的混乱时,请相信我。 这就是为什么你应该总是将日期存储在unixtimestamp中。