作者 主題: 時間_絕對秒數_心得  (閱讀 588 次)

0 會員 與 1 訪客 正在閱讀本文。

dark

  • 俺是博士!
  • *****
  • 文章數: 1498
    • 檢視個人資料
時間_絕對秒數_心得
« 於: 2016-10-17 22:48 »
發問過兩篇有關時間的問題
http://phorum.study-area.org/index.php/topic,71853.msg343960/topicseen.html#msg343960
http://phorum.study-area.org/index.php/topic,69998.msg340076.html#msg340076

以下整理兩篇文章的心得
將一些之前錯誤的觀念更正

若觀念中 , 還有錯誤 , 還請多多指教


一、先來結論跟文獻觀念:

GMT=Greenwich Mean Time=格林威治標準時間
太陽(天文)測量計算(倫敦)

UTC=Coordinated Universal Time=國際協調時間
原子共振頻率 (兩千年誤差一秒鐘) , 1980 起
以上兩縮寫是 "方法"

時區代號(其餘)
CST=Central Standard Time=中原標準時間
CST=GMT+8=UTC+8

PST=Pacific Standard Time=太平洋標準時間
PST=GMT-8=UTC-8


1. linux 下 : /etc/sysconfig/clock
ZONE="Asia/Taipei"
UTC=true
其中 ZONE 參數只是給人看的 。 UTC , GMT 即在此定義
而 date 參考的 "資料庫" 則是 /etc/localtime
範本在 /usr/share/zoneinfo/ (注1)

2. 絕對秒數又常被稱 unix time
=> linux 下其實不是 年-月-日 時:分:秒 在記錄 , 而是只有這個絕對秒數在跑
=> 任何時區下 date +%s 的值 , 都是相同值 => 寫資料時直接取絕對秒數即可 , 不需考慮時區

3. 台灣 = UTC+8
所以 , 台灣時間-8小時 = 地球(格林威治地點)的時間



二、 linux 指令 /bin/date
1. -u = utc (此參數很多餘) help 中是指使用 UTC , 實際作用翻譯成 "瞬間移動到倫敦"
=> date +%F_%T => 請問系統 , 現在日期時間 ?
=> date -u +%F_%T => "瞬間移動到倫敦" , 再 .. 請問系統 , 現在日期時間 ?
=> date --date="2016-10-17 21:00:00 10 min ago" +%F_%T  => 請問這時間是?
=> date -u --date="2016-10-17 21:00:00 10 min ago" +%F_%T  => "瞬間移動到倫敦" , 再請問這時間是?

2. --date (info 中提到 ago 用於計算過去時間)
=> 若只單純 -2 day 或只有 -2 hour , 這時負號不至於出錯
但在 --date="2016-10-17 10:00 -2 hour" 有指定時間時 , 使用負號會出錯


三、日光節約 , 注1 , 舊版 date , 實驗


舊版指的是 , 舊系統中找到的 : date 2.0.11 (附件) , date 4.5.3


日光節約
1945-05-01 1946-05-01 1947-05-01 1948-05-01 1949-05-01 1950-05-01 1951-05-01
1952-03-01 1953-04-01 1954-04-01 1955-04-01 1956-04-01 1957-04-01 1958-04-01
1959-04-01 1960-06-01 1961-06-01 1974-04-01 1975-04-01 1979-06-30
這些日期會出錯 :
[root@newsys]# date --date="1979-06-30" +%F
date: invalid date ‘1979-06-30’
加上 -u 則不會 (因為瞬間移動到倫敦了)
[root@newsys]# date -u --date="1979-06-30" +%F
1979-06-30

這是因為 :
[root@newsys]# for i in {1..4} ; do date --date="1979-06-29 23:59:57 $i sec" +%F_%T_%s; done
1979-06-29_23:59:58_299519998
1979-06-29_23:59:59_299519999
1979-06-30_01:00:00_299520000
1979-06-30_01:00:01_299520001
=> 1979-06-30 這天小時沒有0 , 而 --date="1979-06-30" 其實是 --date="1979-06-30 0:0:0"
=> -u 瞬間移動到倫敦才問 , 那時區的資料庫中 , 是節約其他小時的

到舊版系統中 :
[root@oldsys]# for((i=1;i<5;i++));do date --date="1980-06-29 23:59:57 $i sec" +%F_%T_%s; done
1980-06-29_23:59:58_331142398
1980-06-29_23:59:59_331142399
1980-06-30_01:00:00_331142400
1980-06-30_01:00:01_331142401
=> 修正秒數在一年後
=> 同樣是 Asia/Taipei 的資料庫 , 但 10 年前的系統 , 卻是在 "滿現象一年" 做修正
=> 此萬年曆 , 並非 "方程式" , 所以將來也會依宇宙的改變而改變


證明:
1. 將舊版 date , 複製到新版系統使用
[root@newsys]# for i in {1..4} ; do date_2.0.11/bin/date --date="1979-06-29 23:59:57 $i sec" +%F_%T_%s; done
1979-06-29_23:59:58_299519998
1979-06-29_23:59:59_299519999
1979-06-30_01:00:00_299520000
1979-06-30_01:00:01_299520001
=>相同資料庫 , 節約的小時相同

2. 在新系統中 , 改變時區資料庫
[root@newsys]# cp /usr/share/zoneinfo/America/Chicago /etc/localtime
[root@newsys]# date --date="1979-06-30" +%F_%T_%s
[root@newsys]# 1979-06-30_00:00:00_299566800

3. 舊版防呆 , 體貼設計 :
將時區還原台北
[root@newsys]# date_2.0.11/bin/date --date="1979-06-30" +%F_%T_%s
1979-06-30_01:00:00_299520000
此為 version 2.0.11 的防呆設計 , 直接跳到沒刪除節約的時間

[root@newsys]# date_2.0.11/bin/date --date="1979-06-$((30+90))" +%F_%T_%s
1979-09-28_00:00:00_307292400
舊版自動運算的體貼設計



特地找到舊版 , 因為自動運算消失後 , 曾適應一段時間 (懷念)

而小弟之前那兩篇 , 正因不了解 -u 與絕對秒數
一些主機會登入下指令的 , 就被我偷換 /bin/date 成 -u

不過舊版 date 日光節約的防呆也真的很實用

請問 :
如附件壓縮檔 , 是 32bit 系統程式 , cp 到 64 bit 可用 , /lib/ 下也沒有那兩個 lib 衝突 , 是否真不會影響原 64bit 其他程式 ?

是否有發現哪個 unix-like 64 bit 的 date 有此防呆設計 , 或有 source code 可用 ?


(附件超過 512 k , 分兩檔)
bin/date

lib/libc.so.6
lib/ld-linux.so.2
« 上次編輯: 2016-10-17 23:07 由 dark »

dark

  • 俺是博士!
  • *****
  • 文章數: 1498
    • 檢視個人資料
Re: 時間_絕對秒數_心得
« 回覆 #1 於: 2016-10-17 22:55 »
不好意思 附件舊版 date 重傳
原來 lib 壓完超過 512
必須用 7z