2013-02-14 7 views
21

imをphp 5.4.6とMySQL 5.5.29を使用しています。UNIX TIMESTAMPをMYSQL DATETIMEに変換することで問題が発生します。 Mysqlとphp wunは同じローカルマシン上にあります。PHP-MYSQL:UnixタイムスタンプをDateTimeに変換する(逆も同様)

私は)私は(NOW PHPのPDOとMySQLを使用してデータを挿入するには、単純なMySQLのテーブル

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

を持っています。これは正常に動作し、正しい日時はデータベースに格納されます。

私の計画は、クライアント側のUNIXタイムスタンプで作業することです(サーバ側のPHP & mysql)。

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

だからサンプルクエリは次のようになります。

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry 

結果: 作成した= 2013年2月14日夜08時47分35秒 のTS = 1360871255

は、だから今、私がやりたいですそれ以外の方法では、私はUNIXのタイムスタンプを渡し、私のデータベースのエントリと比較したいです。 Unfortunetly私は動作するPHPスクリプトを書くことができません。私はなぜ知らないが、私はPHPに同じタイムスタンプ(1360871255)を通過mのとき、私はこの方法で2013年2月14日夜08時47分35秒を得ることはありません:(

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

私はtoDateTimeを呼び出します1360871255)は、元のDateTimeではない2013-02-14 20:02:35を返します。

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

私がやりたいことは、私に特定のタイムスタンプよりも古いエントリを示した単純なクエリである。このような単純なもの:

SELECT * FROM Entry WHERE created < 1360871255 

が、私は前に述べたように、クエリの結果が期待されていません1360871255が正しい時刻ではないようだからです。

私はPHPでmysql接続に特別なタイムゾーンを指定しません。

提案がありますか?

答えて

36

date formatが間違っています... iは分ではなく、m(月)です。

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

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

  • あなたはPHP> 5.3を使っているので、再割り当てする必要がすなわち$unixTimestamp = $unixTimestamp;
  • 、ありません。新しいDateTimeオブジェクトに興味があるかもしれません。

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

    あなたが指定した月(m)の日付と時刻の両方の部分で:

+1

くそ、あなたの権利... omg ...私のように愚かな – sockeqwe

+3

@ sockeqwe - あなたは愚かではありません。あなたはちょうどそれを見た。それは起こる。 – Greeso

3

問題は、あなたが書いた機能です。 2番目のmiに置き換える必要があります。これは、PHPでdate()を使用する場合の正しいフラグです。

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

必要に応じて、PHP関数strtotime()が十分に役立つことがあります。

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; 
} 
0

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

1

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

+0

SQL言語は、特に最近のバージョンのものを使用しているので、MySQL拡張機能を使用していません。実際のプログラミング言語で作業するのは、アプリケーションの残りの部分には当てはまらないメタ言語よりもずっと簡単ですばらしいです。 – Deji

関連する問題