2013年10月16日 星期三

TimeZone 介紹

為了要判斷所收到的 timezone 是否是一個合法的 timezone,故將 timezone 格式整理如下,以利快速參考。

在一個 POSIX 系統,Timezone 會儲存於 TZ 環境變數,並且定義三種格式以表示 timezone。但 POSIX.1 標準只描述了前兩種表示方法。


1. std offset

範例:EST+5 
std 為時區的名稱,其格式為一般可列印的字元,但第一個字元不能為 : ,其餘字元則不能包括下列字元 ".,+-",並且std 與 offset 之間不能夠存在空白字元。
The std string specifies the name of the time zone. It must be three or more characters long and must not contain a leading colon, embedded digits, commas, nor plus and minus signs. There is no space character separating the time zone name from the offset, so these restrictions are necessary to parse the specification correctly.
offset 則用來定義與 UTC 所差異的時間,其格式為 [+|-]hh[:mm[:ss]],
TThe offset specifies the time value you must add to the local time to get a Coordinated Universal Time value. It has syntax like [+|-]hh[:mm[:ss]]. This is positive if the local time zone is west of the Prime Meridian and negative if it is east. The hour must be between 0 and 23, and the minute and seconds between 0 and 59.

2. std offset dst [offset],start[/time],end[/time]

範例:EST+5EDT,M4.1.0/2,M10.5.0/2 
此處 std, offset 定義同上,但加入了日光節約時間(Daylight Saving Time) 
start 與 end 分別代表日光節約時間開始影響的時間,以及結束的時間。
這兩個欄位也有三種表現方式
Jn:表示Julian day,n 的值域為 1~365,不算 2/29 
n:表示Julian day,n 的值域為 0~365,包含閏年的 2/29 
Mm.w.d:表示一年中的第m個月,第w個星期,第d天。
time 則用表示時間,若沒有帶此值,預設為02:00:00 
例如: M4.1.0/2 表示四月第一個星期天,上午兩點。 

3. :characters

範例:":/etc/localtime" 或 ":America/New_York" 
此 characters 由各個作業系統定義,就 GNU C library 而言,characters 為儲存 timezone 的檔案名稱。 
例如我們檢視TZ系統變數便可得知 timezone 儲存位置,如下: 
‘TZ=:/etc/localtime’ or ‘TZ=:/usr/local/etc/localtime’ 
如果 characters 首字為 '/' ,便表示此 characters 表示的是檔案絕對路徑,否則便只是一個地域的描述,通常會定義為一個區域加上主要城市,例如:America/New_York, Europe/London, Asia/Hong_Kong.

另外此處整理各個系統 timezone 的操作方法,以下命令分別可用於查詢目前timezone設定查詢可用設定設定timezone
Windows 使用 tzutil
tzutil /g
tzutil /l
tzutil /s "China Standard Time"
Linux
cat /etc/localtime
ls -al /usr/shar/zoneinfo/
ln -sf /usr/share/zoneinfo/EST /etc/localtime
Mac OS 使用 systemsetup,如下
sudo systemsetup -gettimezone
sudo systemsetup -listtimezon
sudo systemsetup -settimezone US/Central

註:在實作 ONVIF 時,其測試所用的範例採用 1,2 兩種方式,因此需要根據上述規則檢查 timezone 是否為合法定義,其中需注意的是對於 dst 並沒強制規定要採用哪些城市,也沒限制一定要某些固定字串。