程序裏的國際時區和夏令時

  1. UTC和GMT到底是什麼
      gmt和utc都是標準時間。
      GMT是比較古老的時間較量標準,根據地球公轉自轉計算時間。UTC則是根據原子鐘來計算時間,現在基本都用UTC時間。
    時區的設置之前研究過https://java-er.com/blog/php-utc-time-default-set/,本文主要研究夏令時
  2. 夏令時計算有幾個坑,需注意:

1) 時間服務器返回的時間爲1900距今的秒數,而我們需要藉助unix時間函數轉爲可讀的時間 ,因此需要先把這個時間減去70年(2208988800s)。

2) 夏令時的開始結束時間使用的是時區轉化後的當地時間,因此時間服務器獲取到的UTC時間需要轉爲本地時間,才能進行時間是否在夏令時區間的判斷。

3) 美國的夏令時,從每年3月第2個星期天凌晨開始,到每年11月第1個星期天凌晨結束。以2017年爲例,美國2017年夏令時從3月12日開始,到11月5日結束。

需要注意的是,美國有部分領土不實行夏令時,其中包括:亞利桑那州 (納瓦霍人保留地除外)、夏威夷、美屬薩摩亞、關島、波多黎各、美屬維京羣島。

  1. 數據庫存儲秒數的意義
    php的time() 返回1970年 0點到現在的秒數 java裏也有。 這個秒數不隨我們設置服務器時區而改變
    所以存儲要存1501829643 這個玩意,而不是2020-02-01 03:40:58

  2. 程序裏時區設置的意義
    當我們弄清楚存儲了一個固定的值,那麼時區只是展示問題。
    我是中國人在中國,那麼程序設置爲中國時區

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”.

程序的時區設計僅僅爲了展示給客戶看。

  1. 夏令時的祕密

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

https://java-er.com/blog/time-zone-summer-day/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章