2017-06-13 36 views
8

我有一個存儲在數據庫中的日期。日期爲2017-03-01。該字段是「日期」字段。在PHP中使用strtotime()和在MySQL中使用UNIX_TIMESTAMP()時的不同時間戳

當我在 「2017年3月1日」 顯示我的MySQL查詢,使用

DATE_FORMAT(orderdate, '%d.%m.%Y') as mydate 

當我使用

UNIX_TIMESTAMP(orderdate) as mydate 

和輸出它像date('d.m.Y', $mydate)

我收到2017年2月28日作爲一個結果。

這是一個「二月 - 問題」?我怎樣才能讓日期()做對了?

-----------------編輯1 -----------------

我把這個在我的代碼已經在之前。

# set timezone 
date_default_timezone_set('Europe/Vienna'); 

# daylight-saving time 
if(date('I') < 1){ 
mysqli_query($db, "SET time_zone = '+01:00'"); 
}else{ 
mysqli_query($db, "SET time_zone = '+02:00'"); 
} 

-----------------編輯2 -----------------

好吧,我生成的MySQL表與此內容(字段類型:「日期」):

xdate 
2017-01-01 
2017-01-15 
2017-01-31 
2017-02-01 
2017-02-15 
2017-02-28 
2017-03-01 
2017-03-15 
2017-03-31 
2017-04-01 
2017-04-15 
2017-04-30 
2017-05-01 
2017-05-15 
2017-05-31 
2017-06-01 
2017-06-15 

生成的輸出從我的腳本:

Current Time 
2017-06-16 02:31:08 PHP-Time 
2017-06-16 02:31:08 MySQL-Time 

Col 1  Col 2  Col 3  Col 4  Col 5  Col 6 
1483221600 2016-12-31 1483225200 2017-01-01 2017-01-01 2017-01-01 
1484431200 2017-01-14 1484434800 2017-01-15 2017-01-15 2017-01-15 
1485813600 2017-01-30 1485817200 2017-01-31 2017-01-31 2017-01-31 
1485900000 2017-01-31 1485903600 2017-02-01 2017-02-01 2017-02-01 
1487109600 2017-02-14 1487113200 2017-02-15 2017-02-15 2017-02-15 
1488232800 2017-02-27 1488236400 2017-02-28 2017-02-28 2017-02-28 
1488319200 2017-02-28 1488322800 2017-03-01 2017-03-01 2017-03-01 
1489528800 2017-03-14 1489532400 2017-03-15 2017-03-15 2017-03-15 
1490911200 2017-03-31 1490911200 2017-03-31 2017-03-31 2017-03-31 
1490997600 2017-04-01 1490997600 2017-04-01 2017-04-01 2017-04-01 
1492207200 2017-04-15 1492207200 2017-04-15 2017-04-15 2017-04-15 
1493503200 2017-04-30 1493503200 2017-04-30 2017-04-30 2017-04-30 
1493589600 2017-05-01 1493589600 2017-05-01 2017-05-01 2017-05-01 
1494799200 2017-05-15 1494799200 2017-05-15 2017-05-15 2017-05-15 
1496181600 2017-05-31 1496181600 2017-05-31 2017-05-31 2017-05-31 
1496268000 2017-06-01 1496268000 2017-06-01 2017-06-01 2017-06-01 
1497477600 2017-06-15 1497477600 2017-06-15 2017-06-15 2017-06-15 

當前時間是在我的電腦上顯示的同一時間。所以這是正確的時間和時間設置似乎沒問題。 「當前時間」由date()生成 - 函數在PHP中與MySQL的NOW()。

Col 1是MySQL-Query的UNIX_TIMESTAMP。

西2是與PHP-日期 - 功能生成的日期和Col 1.

西3是的strtotime的Unix時間戳()。

山口4是與PHP-日期 - 功能和Col 3.

山口5產生的日期與DATE_FORMAT格式化日期(xdate, '%Y-%間 - %d')。

Col 6是直接從數據庫中得到的日期。

正如你所看到的,前八行是錯誤的日期()計算 - 被供給與功能(第2列)UNIX_TIMESTAMP()了MySQL查詢的(錯誤):

date('d.m.Y', $mydate) 

我測試會發生什麼,如果我更換線

mysqli_query($db, "SET time_zone = '+02:00'"); 

mysqli_query($db, "SET time_zone = '+01:00'"); 

的日期功能GIV回到正確的日期,但MySQL中的NOW()會傳遞錯誤的時間。

當我使用腳本中的設置刪除零件(請參閱編輯1)時,一切都是平等的,但我有錯誤的時區。

有沒有人對我有幫助?

+0

這是PHP和MySQL之間的時區問題/區別。 – AbraCadaver

+0

hmmm我已經把時區設置放在了我的設置文件中..參見我的edit1 – Bernhard

+2

@Bernhard,比較兩個UNIX時間戳,以便更好地理解它出錯的地方。如果他們是一樣的,那麼問題出現在時區中。如果他們不同,服務器時間是不同的。 –

回答

5

好吧,我的設置似乎沒問題,似乎是,PHP中的strtotime()與Timezones一起使用,與MySQL中的UNIX_TIMESTAMP相反。我決定替換選擇UNIX_TIMESTAMP()的SELECTS,並用strtotime()將它轉換爲時間戳。現在它可以工作。

2

將您的格式擴展爲包括小時和分鐘,1讓您10將LOCAL服務器日期(根據其時區)與UNIXTIME(格林尼治時間以東的時區)進行比較。

1

我從來不理解需要重新計算自1970年以來秒數的有效提交日期。 當然,之後這些秒被重新格式化爲可讀的日期顯示。

` 
<?php 
$dtDate = new \DateTime('2017-03-01'); 
echo $dtDate->format('d.m.Y'); 
?> 
` 

但在這兩種情況下,應該意識到的PHP和數據庫服務器


的時區兩者的時區設置:日期時間,可以有第二個參數指定的時區


至於開場白中顯示的日期:2017年3月31日至2017年是節日開始後的第一天(從3月26日星期日開始) 另外一個不會假設每天有24 * 60 * 60秒的原因

+1

重點是有一個標準的日期,不確定/不贊成一個特定的宗教觀點。爲什麼在倫敦1/1/19比2K +年前的冬至更糟糕,基督教信仰選擇每年慶祝一個所謂的超自然生物誕生呢? –