2012-12-09 46 views
3

我遇到了一個有點令人沮喪的問題,我有一種感覺,有一個簡單的解決方案。當我將相同的UNIX時間戳傳遞給PHP date和MySQL FROM_UNIXTIME方法時,它們返回兩個完全不同的日期。我想從MySQL返回一個與PHP返回的值相匹配的值。PHP和MySQL正在爲相同的時間戳返回不同的日期

這是我目前使用的代碼以及它的輸出。提供的時間戳代表日期Tue, 01 Jan 2013 (01/01/2013)。另外供參考,這裏是格式值。

MySQL的格式

  • 引用%j年(001..366)的=日。
  • %m =月份,數字(00..12)。
  • %y =年份,數字(兩位數字)。

PHP格式

  • Z = 0(0到365)開始的一年中的天。
  • m =一個月的數字表示,前導零(01到12)。
  • y =一年的兩位數表示(例如:99或03)。

MySQL查詢

SELECT FROM_UNIXTIME(1357018200, '%j-%m-%y'); 
-> 366-12-12 

PHP代碼

echo date('z-m-y', 1357018200); 
-> 0-01-13 

任何幫助將不勝感激,感謝您的時間。 :)

其他信息

  • MySQL版本:5.5.23
  • MySQL的system_time_zone:CDT
  • MySQL的TIME_ZONE:SYSTEM
  • PHP date_default_timezone_get:美洲/ C hicago(CDT)
+4

我認爲這可能是一個時區問題。檢查什麼時區MySQL('show variables like'%time_zone';')和PHP使用(['date_default_timezone_get'](http://php.net/manual/en/function.date-default-timezone-get.php) )。 – vstm

+0

是的 - 以及發佈這些變量,你可以發佈你正在使用的MySQL版本。 – Danack

+0

我已經使用時區信息和SQL版本更新了帖子。 :) – Artail

回答

2

您的PHP和MySQL在時間上並不一致。使用時間轉換器在:

http://www.4webhelp.net/us/timestamp.php?action=stamp&stamp=1357018200&timezone=-6

給出結果「週一,2012年12月31日,23:30:00(北京時間),」所以你的PHP是給錯誤的結果。儘管你已經給出了PHP運行的時區,你可以通過運行來檢查:

date_default_timezone_set ("America/Chicago"); 
echo date('z-m-y', 1357018200)."\r\n"; 

應該給出「365-12-12」。

我想這可能是某些事情是在其他地方錯誤地設置時區,或者可能是「America/Chicago(CDT)」是您的php.ini文件中早期版本的PHP中的舊設置。

查看http://php.net/manual/en/timezones.america.php允許的時區值列表中沒有列出「美國/芝加哥(CDT)」,因此您應該找出它被設置爲該僞造值的位置,因爲它可能會導致其他問題。

+0

MySQL返回'2012-12-09'和'00:45:19'。 PHP返回'Sun,09年12月9日00:45:19 -0600'。 – Artail

+0

強制它設置時區確實使其返回預期值,這很奇怪,因爲我的腳本中沒有一個與時區混淆。非常感謝你的幫助! – Artail

1

一旦你得到了你的時區的問題整理出來,回答您的實際問題是:

function sqlStyleDate($timestamp){ 

    $dayOfYear = date("z", $timestamp) + 1; 
    $year = date("y", $timestamp); 
    $month = date("n", $timestamp); 

    $result = "$dayOfYear-$year-$month"; 

    return $result; 
} 

echo sqlStyleDate(1357018200)."\r\n"; 

,將轉換PHP的0-365天一年,爲同MySQL的1-366一年中的一天。

+0

您應該將其編輯到您現有的答案中,因爲它潛藏在問題的核心,並且是正確的。 – Charles

相關問題