0

日付を返すクエリがあり、自分のページでユーザーに表示する前に書式を設定したいと考えています。ただし、形式を使用すると、日付が null のように見えます (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またはlast Updatedフィールドの場合):

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 に変更しようとしましたが、うまくいきません。

ご提案いただきありがとうございます。

4

3 に答える 3

5

$threadDetailItem['createdOn']は文字列であり、date()関数は数値のタイムスタンプを想定しているためです。strtotime()最初に PHP 関数を使用して、文字列をタイムスタンプに変換します。

date("F j, Y, g:i a", strtotime($threadDetailItem['createdOn']))
于 2012-04-16T15:20:15.087 に答える
0

文字列は、最初に関数を使用して Timestamp に変換する必要がありstrtotimeます。

$date=$variable['from-database'];
date("Y-m-d",strtotime($date))
于 2016-03-01T06:24:41.537 に答える
-1

PHPのdate()関数は、日付文字列ではなく、UNIXタイムスタンプhttp://en.wikipedia.org/wiki/Unix_timeを使用します。

代わりにBIGINTを使用するようにデータベーススキーマを変更し、date( "U")を使用して日付情報を格納することを強くお勧めします。そうした場合、日付とロケールの形式でハゼルを回避できます。INTも使用できますが、使用する場合、システムは2038以降の日付を処理できます。

strtotime()関数http://se2.php.net/manual/en/function.strtotime.phpを使用できます。

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

ただし、日付が間違ったロケールに保存されていると、間違った答えが返されます。日付の文字列とロケールは本当に混乱する可能性があると私が言うとき、私を信じてください。そのため、常に日付をunixtimestampに保存する必要があります。

于 2012-04-16T15:32:24.183 に答える