Date

如何讓“日期”輸出不同時區的時間?

  • November 2, 2020

我有一個執行時區設置為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)。startend時間欄位指示標準/日光轉換發生的時間。

例如,在美國東部,標準時間比 UTC 早 5 小時,我們可以EST5EDT指定America/New_York. 然而,這些替代方案並不總是得到認可,特別是對於美國以外的地區,最好避免使用。

HP-UX(一個 SUSv3 兼容的 UNIX)使用文本規則/usr/lib/tztab和 POSIX 名稱,如 EST5EDT、CST6CDT、MST7MDT、PST8PDT。該文件包括每個時區的所有歷史規則,類似於 Olson 數據庫。

**注意:**您應該能夠通過檢查以下目錄找到所有時區:/usr/share/zoneinfo.

引用自:https://unix.stackexchange.com/questions/48101