27

php5.4.6とMySQL5.5.29を使用しているのですが、UNIXTIMESTAMPをMYSQLDATETIMEに、またはその逆に変換すると問題が発生します。Mysqlとphpは同じローカルマシンで実行されます。

私は単純なmysqlテーブルを持っています

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

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

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

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

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

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry

結果:作成済み= 2013-02-14 20:47:35 TS = 1360871255

それで、今は別の方法でやりたいと思います。UNIXタイムスタンプを渡し、それをデータベースのエントリと比較したいと思います。残念ながら、動作するPHPスクリプトを作成できません。理由はわかりませんが、同じタイムスタンプ(1360871255)をPHPに渡すと、次のメソッドで2013-02-1420:47:35を取得できません。

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

toDateTime(1360871255)を呼び出すと、元のDateTimeではない2013-02-1420:02:35が返されます。

MYSQLで使用するために1360871255をYmdH:m:sにフォーマットする必要はありませんが、1360871255は私が期待した時間ではないようです(そしてMYSQL UNIX_TIMESTAMPが戻ってきました)。

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

SELECT * FROM Entry WHERE created < 1360871255

ただし、前述したように、1360871255は正しい時刻ではないように思われるため、クエリ結果は予期されていません。

phpでmysql接続に特別なタイムゾーンを指定していません。

助言がありますか?

4

5 に答える 5

49

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

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

いくつかのサイドノート:

  • 再割り当てする必要はありません。$unixTimestamp = $unixTimestamp;
  • PHP>5.3を使用しているため。新しいDateTimeオブジェクトに興味があるかもしれません。
于 2013-02-14T20:42:22.903 に答える
4

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

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

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

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

ニーズによっては、PHP関数strtotime()が十分に役立つ場合があります。

于 2013-02-14T20:50:42.770 に答える
2

mysqlでFROM_UNIXTIME関数を使用してみませんか?

于 2016-04-07T09:45:24.077 に答える
0
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;
}
于 2015-11-17T12:32:06.687 に答える
0

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

于 2015-12-27T14:59:25.617 に答える