簡體   English   中英

在PHP中使用strtotime()和在MySQL中使用UNIX_TIMESTAMP()時的不同時間戳

[英]different Timestamps when using strtotime() in PHP and UNIX_TIMESTAMP() in MySQL

我有一個存儲在數據庫中的日期。 日期是2017-03-01。 該字段是“日期”字段。

我用的時候

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

在我的MySQL-Query中,顯示“01.03.2017”。

我用的時候

UNIX_TIMESTAMP(orderdate) as mydate

並輸出date('dmY', $mydate)

結果我得到28.02.2017。

這是“二月問題”嗎? 我怎樣才能讓date()做得對?

-----------------編輯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中的函數和NOW()的MySQL。

Col 1是MySQL-Query的UNIX_TIMESTAMP。

Col 2是使用PHP-Date-Function和Col 1生成的日期。

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

Col 4是使用PHP-Date-Function和Col 3生成的日期。

第5列是使用DATE_FORMAT格式化的日期(xdate,'%Y-%m-%d')。

第6列是直接來自數據庫的日期。

正如您所看到的,前八行是錯誤的,由date() - 函數(第二列)計算得到了MySQL-Query的(錯誤的?)UNIX_TIMESTAMP():

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

如果我更換線路,我測試了會發生什么

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

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

date-Function返回正確的Date,但是在NOW中的NOW()提供了錯誤的時間。

當我從腳本中刪除帶有“設置”的部分時(參見編輯1),一切都是相同的,但后來我的時區錯誤。

有人對我有任何線索嗎?

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

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

我永遠不會理解需要重新計算自1970年以來的有效呈現日期。當然,之后這些秒被重新格式化為可讀的日期呈現。

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

但無論哪種情況,都應該了解php和數據庫服務器的時區設置


對於時區:DateTime,可以有第二個參數指定時區


至於開幕式中顯示的日期:日期31-3-2017是2017年節日開始之后的第一個日期(從3月26日星期日開始)也是每天不假設的原因有24 * 60 * 60秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM