web-dev-qa-db-ja.com

PHP-MYSQL:UnixタイムスタンプからDateTimeへの変換、およびその逆

php 5.4.6とMySQL 5.5.29を使用していて、UNIXのTIMESTAMPをMYSQL DATETIMEに、またはその逆に変換すると問題が発生します。 Mysqlとphpは同じローカルマシン上で動作します。

シンプルなmysqlテーブルがあります

CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);

データを挿入するには、php PDOとmysql NOW()を使用します。これは正常に機能し、正しい日時がデータベースに保存されます。

私の計画は、クライアント側(サーバー側のphpとmysql)でUNIXタイムスタンプを使用することです。

だから私はクライアントにUNIXタイムスタンプを配信したいと思います。したがって、MySql UNIX_TIMESTAMP()関数を使用して、クエリで直接変換します。

したがって、サンプルクエリは次のようになります。

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry

結果:created = 2013-02-14 20:47:35 TS = 1360871255

そのため、今度は別の方法でUNIXタイムスタンプを渡し、データベースのエントリと比較したいと思います。不幸なことに、PHP動作するスクリプトを書くことができません。理由はわかりませんが、同じタイムスタンプ(1360871255)をPHP=この方法では2013-02-14 20:47:35を取得できません。

public static function toDateTime($unixTimestamp){
    return date("Y-m-d H:m:s", $unixTimestamp);
}

ToDateTime(1360871255)を呼び出すと、2013-02-14 20:02:35が返されますが、これは元のDateTimeではありません。

MYSQLで使用するために1360871255をY-m-d H:m:sにフォーマットする必要はありませんが、1360871255は予想した時間ではないようです(そしてMYSQL UNIX_TIMESTAMPが戻りました)。

私がやりたいのは、特定のタイムスタンプよりも古いエントリを表示する単純なクエリで、次のような単純なものです。

SELECT * FROM Entry WHERE created < 1360871255

ただし、前述のとおり、1360871255は正しい時刻ではないため、クエリ結果は予期されていません。

Phpのmysql接続に特別なタイムゾーンを指定しません。

助言がありますか?

24
sockeqwe

日付形式 が間違っています... im(月)ではなく分です。

return date("Y-m-d H:i:s", $unixTimestamp);

いくつかの補足事項:

  • 再割り当てする必要はありません。つまり、$unixTimestamp = $unixTimestamp;
  • PHP> 5.3。を使用しているため、新しい DateTime オブジェクトに興味があるかもしれません。
41
Jason McCreary

問題はあなたが書いた関数にあります:

return date("Y-m-d H:m:s", $unixTimestamp);

日付部分と時刻部分の両方でmonth(m)を指定します。 2番目のmiに置き換える必要があります。これは、PHPでdate()を使用する場合の時間の正しいフラグです。

return date("Y-m-d H:i:s", $unixTimestamp);

ニーズに応じて、PHP function strtotime()が十分に役立つ場合があります。

3
BadAlgorithm

MysqlでFROM_UNIXTIME関数を単純に使用しないのはなぜですか?

2
function format_date($str) {
    $month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec");
    $y = explode(' ', $str);
    $x = explode('-', $y[0]);
    $date = "";    
    $m = (int)$x[1];
    $m = $month[$m];
    $st = array(1, 21, 31);
    $nd = array(2, 22);
    $rd = array(3, 23);
    if(in_array( $x[2], $st)) {
            $date = $x[2].'st';
    }
    else if(in_array( $x[2], $nd)) {
            $date .= $x[2].'nd';
    }
    else if(in_array( $x[2], $rd)) {
            $date .= $x[2].'rd';
    }
    else {
            $date .= $x[2].'th';
    }
    $date .= ' ' . $m . ', ' . $x[0];

    return $date;
}
0
user3723383

両方とも。タイムスタンプをINTまたはBIGINTとして保存する必要があります。mysqlのTIMESTAMP形式を使用すると、intに戻されないためです。このようなものしか取得できません1970-01-01 01:00:00

0
user5719402