如何讓“日期”輸出不同時區的時間?
我有一個執行時區設置為
UTC
. 這似乎是一個很好的做法(如果我錯了,請糾正我)。無論如何,為了
scp
文件,我連接到的其中一台伺服器正在執行EDT
並儲存我需要以格式複制的文件/path/to/filename/data20120913
我試圖
rsync
使用類似 find 的-mtime -1
標誌來查找文件,以查找在最後一天修改的文件,但我沒有任何運氣。我不介意只
scp
用來複製當天的文件,但截至目前,有一個 4 小時的視窗,執行date +%Y%m%d
將在每台伺服器上給出不同的一天,這讓我有點惱火。通過
man date
查看,我發現我可以將時間輸出為UTC
,但我看不到將其輸出為另一個時區的方法EDT
我想我也可以使用
GNU
日期擴展之類的東西date -d 20100909 +%s
從紀元中獲取以秒為單位的日期,應用手動4 * 60 * 60
秒計算,並查看如何將其渲染為日期 - 但是當日光時間開始時,它仍然會減少一個小時.是否有更簡單的方法可以在設置為的伺服器上以
YYYYMMDD
格式輸出日期?EDT``UTC
您可以在查詢期間設置時區,因此:
TZ=America/New_York date
TZ
注意設置和date
命令之間的空格。在 Bourne-like 和rc
-like shell 中,TZ
它只為命令行設置變數。在其他 shell (csh
,tcsh
,fish
) 中,您始終可以使用以下env
命令:env TZ=America/New_York date
tl;博士
在 Linux 系統上。時區在目錄中的文件中定義
/usr/share/zoneinfo
。這種結構通常被稱為“奧爾森數據庫”,以紀念其創始貢獻者。每個時區的規則被定義為文本文件行,然後編譯成二進製文件。如此編譯的行,定義區域名稱;該區域適用的數據范圍和時間;標準時間與 UTC 的偏移量;以及用於定義如何轉換夏令時的符號(如果適用)。
例如,目錄“America”在上面使用的文件中包含紐約的必要資訊
America/New_York
。請注意,不存在的區域(文件名)的規範會被靜默忽略並報告 UTC 時間。例如,這會報告不正確的時間:
TZ="America/New York" date ### WRONG ###
單一 UNIX 規範,版本 3,稱為 SUSv3 或 POSIX-2001,指出為了可移植性,標識時區描述的字元串應以冒號字元開頭。因此,我們也可以這樣寫:
TZ=":America/New_York" date TZ=":America/Los_Angeles" date
作為使用描述文件的路徑名指定時區的替代方法,SUSv3 描述了 POSIX 模型。在這種格式中,字元串定義為:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
其中
std
是標準組件名稱,dst
是夏令時名稱。每個名稱由三個或更多字元組成。對本初子午線以西的offset
時區為正數,對本初子午線以東的時區為負數。將偏移量添加到本地時間以獲得 UTC(以前稱為 GMT)。start
和end
時間欄位指示標準/日光轉換發生的時間。例如,在美國東部,標準時間比 UTC 早 5 小時,我們可以
EST5EDT
指定America/New_York
. 然而,這些替代方案並不總是得到認可,特別是對於美國以外的地區,最好避免使用。HP-UX(一個 SUSv3 兼容的 UNIX)使用文本規則
/usr/lib/tztab
和 POSIX 名稱,如 EST5EDT、CST6CDT、MST7MDT、PST8PDT。該文件包括每個時區的所有歷史規則,類似於 Olson 數據庫。**注意:**您應該能夠通過檢查以下目錄找到所有時區:
/usr/share/zoneinfo
.