2013-02-14 171 views
21

即時通訊使用PHP 5.4.6和MySQL 5.5.29,我將UNIX TIMESTAMP轉換爲MYSQL DATETIME,反之亦然。 Mysql和php wun在同一臺本地機器上。PHP-MYSQL:將Unix時間戳轉換爲DateTime,反之亦然

我有一個簡單的MySQL表

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

將數據插入我使用PHP的PDO和MySQL NOW()。這工作正常,正確的日期時間存儲在數據庫中。

我的計劃是在客戶端使用unix時間戳(服務器端的php & mysql)。

所以我想提供unix時間戳到我的客戶端。 因此,我使用MySql UNIX_TIMESTAMP()函數直接在查詢中進行轉換。

因此,一個簡單的查詢看起來是這樣的:

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry 

結果: 創建= 2013年2月14日二十時47分35秒 TS = 1360871255

所以現在我想要做的換句話說,我傳遞了一個UNIX時間戳,並希望將其與數據庫中的條目進行比較。不幸的是我不能寫一個可行的PHP腳本。我不知道爲什麼,但是當我米傳遞相同的時間戳(1360871255)到PHP我不同意這種方法得到2013年2月14日二十時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。

我知道,我不需要將1360871255格式化爲Y-m-d H:m:s,以便在MYSQL中使用它,但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); 

一些旁註:

  • 有沒有必要重新分配,即$unixTimestamp = $unixTimestamp;
  • 由於您使用PHP> 5.3。您可能對新的DateTime對象感興趣。
+1

該死的,你的權利... omg ...即時通訊如此愚蠢 – sockeqwe 2013-02-14 20:50:13

+3

@sockeqwe - 你並不愚蠢。你只是俯視它。它發生了。 – Greeso 2017-08-10 17:33:58

3

問題就出在你寫的功能:可以在日期和時間部分

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

您指定月(M)。你應該使用PHP的日期()時,正確的標誌更換第二幾個小時。

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

兩者都沒有。您應該將時間戳保存爲INTBIGINT,因爲如果您使用TIMESTAMP格式的mysql,則永遠不會將其恢復爲int。你只能得到這樣的東西1970-01-01 01:00:00

1

爲什麼不簡單地在mysql中使用FROM_UNIXTIME函數?

+0

SQL語言很糟糕,所以使用MySQL擴展,特別是最近版本的擴展。使用實際的編程語言比使用其他應用程序不適合的元語言更容易和更好。 – Deji 2016-04-08 10:04:26