- UTC和GMT到底是什麼
gmt和utc都是標準時間。
GMT是比較古老的時間較量標準,根據地球公轉自轉計算時間。UTC則是根據原子鐘來計算時間,現在基本都用UTC時間。
時區的設置之前研究過https://java-er.com/blog/php-utc-time-default-set/,本文主要研究夏令時 - 夏令時計算有幾個坑,需注意:
1) 時間服務器返回的時間爲1900距今的秒數,而我們需要藉助unix時間函數轉爲可讀的時間 ,因此需要先把這個時間減去70年(2208988800s)。
2) 夏令時的開始結束時間使用的是時區轉化後的當地時間,因此時間服務器獲取到的UTC時間需要轉爲本地時間,才能進行時間是否在夏令時區間的判斷。
3) 美國的夏令時,從每年3月第2個星期天凌晨開始,到每年11月第1個星期天凌晨結束。以2017年爲例,美國2017年夏令時從3月12日開始,到11月5日結束。
需要注意的是,美國有部分領土不實行夏令時,其中包括:亞利桑那州 (納瓦霍人保留地除外)、夏威夷、美屬薩摩亞、關島、波多黎各、美屬維京羣島。
-
數據庫存儲秒數的意義
php的time() 返回1970年 0點到現在的秒數 java裏也有。 這個秒數不隨我們設置服務器時區而改變
所以存儲要存1501829643 這個玩意,而不是2020-02-01 03:40:58 - 程序裏時區設置的意義
當我們弄清楚存儲了一個固定的值,那麼時區只是展示問題。
我是中國人在中國,那麼程序設置爲中國時區
date_default_timezone_set("Etc/GMT-8");
代表+8 區
我是美國人在美國,那麼程序設置爲美國時區
date_default_timezone_set("Etc/GMT+5");
代表-5區
爲啥是反的,有人在官方聊過這個話題。
http://www.php.net/manual/en/timezones.others.php
The plus and minus signs (+/-) are not intuitive. For example,
“Etc/GMT-10” actually refers to the timezone “(GMT+10:00)
Canberra,Sydney,Melbourne”.
程序的時區設計僅僅爲了展示給客戶看。
- 夏令時的祕密
date_default_timezone_set("America/New_York");
$time1 = date("Y-m-d H:i:s");
$times1 = strtotime($time1);
echo "紐約時區:".$time1." - ".$times1."<br>";
echo "該時區使用夏令時:".date('I', time()).'<hr />';
$time = time()-23024*3600;//推算到1月
$stime = strftime( "%Y-%m-%d %H:%M:%S" ,$time)."<br>";
echo "60天前今天現在時間:".$stime;
echo "該時區使用夏令時:".date('I', time()).'<hr />';
echo "<hr />";
date_default_timezone_set("ETC/GMT+4");
$time1 = date("Y-m-d H:i:s");
$times1 = strtotime($time1);
echo "GMT+4:".$time1." - ".$times1."<br>";
echo "該時區使用夏令時:".date('I', time()).'<hr />';
$time = time()-23024*3600;//推算到1月
$stime = strftime( "%Y-%m-%d %H:%M:%S" ,$time)."<br>";
echo "60天前今天現在時間:".$stime;
echo "該時區使用夏令時:".date('I', time()).'<hr />';
echo "<hr />";
輸出
紐約時區:2020-03-30 03:31:27 - 1585553487
該時區使用夏令時:1
60天前今天現在時間:2020-01-30 02:31:27
該時區使用夏令時:1
GMT+4:2020-03-30 03:31:27 - 1585553487
該時區使用夏令時:0
60天前今天現在時間:2020-01-30 03:31:27
該時區使用夏令時:0
date_default_timezone_set("America/New_York");
這個時區的設置會因爲夏令時的原因,導致在冬季時間不一樣
date_default_timezone_set("ETC/GMT+4");
這種設置模式,也代表了紐約,但是在時間不受到夏令時的影響而變化。
結論:
1.當爲了給客戶(紐約人)看時間,應採用America/New_York,
2.當計算機爲了跑一天的數據,比如今天賣了多少貨物,應該用ETC/GMT+4 固定時間。不然那錯開的1小時,我們計算給前一天,還是後一天,感覺都不太適合
額外的小研究:
date_default_timezone_set("UTC");
這個UTC 好像是個什麼標準玩意,當設置UTC+4 UTC-8的時候,程序輸出時間沒有改變,所以大家設置時區用ETC/GMT才能+4 -8