timezones
位於 base
包(package)。 說明
有關時區的信息R.Sys.timezone
返回當前時區的名稱。
用法
Sys.timezone(location = TRUE)
OlsonNames(tzdir = NULL)
參數
location |
邏輯:已失效:被忽略,並對錯誤值發出警告。 |
tzdir |
要使用的時區數據庫:默認情況下是嘗試已知位置,直到找到為止。 |
細節
時區是係統特定的主題,但現在幾乎所有R平台使用類似的底層代碼,由 Linux、macOS、Solaris、AIX 和 FreeBSD 使用,並安裝R在 Windows 上。 (不幸的是,在實現中存在許多特定於係統的錯誤。)可以使用RUnix 類係統以及 Windows 上的源代碼版本:這是 macOS 上的默認版本。
應該可以通過環境變量設置當前時區TZ:請參閱“時區名稱”部分以了解合適的值。Sys.timezone()
將返回值TZ如果最初設置(並且在某些操作係統上總是設置),否則它將嘗試從操作係統檢索一個值,如果設置為TZ將給出初始時區。 (“最初”是指在使用任何時區函數之前:如果TZ被設置為覆蓋操作係統設置,或者如果 ‘try’ 沒有正確設置,則應在R進程已啟動或(可能足夠早)在文件中.Rprofile
)。
如果TZ已設置但無效,大多數平台默認為‘UTC’,時區俗稱‘GMT' (看https://en.wikipedia.org/wiki/Coordinated_Universal_Time)。 (某些但不是所有平台都會對無效值發出警告。)如果未設置或為空,係統使用時區(由Sys.timezone
)。
時區直到 19 世紀中葉才開始使用,直到 20 世紀才被廣泛采用,夏令時(DST,也稱為夏令時)於 20 世紀初首次引入,最廣泛應用是在 1916 年。過去 100 年來,一些地方改變了主要時區之間的隸屬關係,在不同年份選擇退出(或加入)DST,或者較晚或根本不采用 DST 規則更改。 (例如,英國僅在 1971 年嘗試了夏令時。)在一些國家(其中一個是愛爾蘭共和國),夏季時間是 ‘standard’ 時間,冬季使用不同的名稱。一年中可能會有多次變化,例如齋月。
一個相當常見的係統實現POSIXct
被視為有符號 32 位整數,因此隻能追溯到 1901 年底:在此類係統上R假設在此之前的日期與 1902 年處於同一時區。到 1902 年,世界上大多數國家都沒有采用時區(因此使用基於經度的當地“平均時間”),但少數地方已經采用了時區- 在此之前區域發生變化。 64 位表示法正成為迄今為止最常見的表示法;不幸的是,在某些 64 位操作係統上,數據庫信息是 32 位的,因此僅適用於 1901-2038 年的範圍,並且不完整地適用於最後幾年。
當在會話中首次找到時區位置時,其值將緩存在基礎環境中的對象 .sys.timezone
中。
值
Sys.timezone
返回特定於操作係統的字符串,可能NA
或空字符串(在某些操作係統上意味著“UTC’)。這將是一個位置,例如"Europe/London"
如果可以確定的話。
時區區域可能有多個名稱:例如“"Europe/London"” 也可稱為“GB', 'GB-Eire', '歐洲/貝爾法斯特', '歐洲/根西島', '歐洲/Isle_of_Man' 和 '歐洲/澤西島’。一些地區還可以通過其時區的摘要來了解,例如'PST8PDT' 是 ' 的別名美國/Los_Angeles’。
OlsonNames
返回一個字符向量,典型情況參見示例。它可能有一個屬性"Version"
, 就像是 '"2023a"’。 (它在使用的係統上確實如此--with-internal-tzcode以及 Fedora 之類的分發文件‘tzdata.zi’。)
時區名稱
所有平台都接受名稱 "UTC"
及其同義詞 "GMT"
。
操作係統說明其有效時區的位置可能很模糊。 C函數的幫助tzset
可能有幫助,但也可能不準確。有一個繁瑣的 POSIX 規範(在環境變量下列出)TZ在https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08),通常至少部分受支持,但還有其他更用戶友好的方法來指定時區。
幾乎全部R平台使用最初由 Arthur David Olson 編譯、現在由 IANA 管理的時區數據庫,其中引用時區的首選方式是按位置(通常是城市),例如,Europe/London
,America/Los_Angeles
,Pacific/Easter
在“時區區域”內。一些傳統的名稱也是允許的,例如EST5EDT
或者GB
。 (請注意,其中一些名稱可能不是您所期望的:特別是EST
是加拿大使用的時區沒有夏令時,而不是EST5EDT
也可以是(澳大利亞)東部標準時間。)該名稱也可以是一個可選的冒號,附加在提供編譯區域信息的文件路徑之前(上麵的示例都是係統特定位置中的所有文件)。看https://data.iana.org/time-zones/tz-link.html了解更多詳細信息和參考。按照慣例,自 1970 年以來具有獨特時區曆史的地區在數據庫中都有特定的名稱,但具有不同早期曆史的地區可能沒有。每個時區有一個或兩個(第二個為 DST)縮寫格式化時間時使用。
多年來使用的縮寫已經發生變化:例如法國使用“PMT”(“巴黎標準時間”)從 1891 年到 1911 年,然後“濕/西” 直到 1940 年並且“歐洲中部夏令時間’從 1946 年開始。(自 1970 年以來,幾乎所有時區的縮寫都保持穩定。)POSIX 標準隻允許每個時區使用一到兩個縮寫,因此您可能會看到當前使用的較舊時間縮寫。
對於某些時區,縮寫類似於“-03' 和 '+0845’:這是在沒有官方縮寫的情況下完成的。 (負值位於 UTC 後麵(以西),至於"%z"
格式為strftime
.)
函數OlsonNames
返回當前選定的 Olson/IANA 數據庫已知的時區名稱。文件係統中的係統特定位置各不相同,例如'/usr/share/zoneinfo’(Linux、macOS、FreeBSD)、‘/usr/share/lib/zoneinfo’(Solaris、AIX),....很可能有一個名為‘zone1970.tab” 或(較舊的)“zone.tab’在該目錄下列出了稱為時區名稱的位置(但不是例如EST5EDT
)。也可以看看https://en.wikipedia.org/wiki/Zone.tab.
在哪裏R配置了選項--with-internal-tzcode(Windows 上的默認設置),數據庫位於file.path(R.home("share"), "zoneinfo")
默認使用:文件‘VERSION’在該目錄中說明了版本。該選項也是 macOS 上的默認選項,但以較新的係統數據庫為準:/var/db/時區/zoneinfo’並且分發了R默認使用。環境變量TZDIR可用於給出不同‘的完整路徑區域信息’ 數據庫:值"internal"
表示數據庫來自R來源和"macOS"
表示係統數據庫。 (設置這些值中的任何一個都不會被使用的其他軟件識別TZDIR.)
環境TZDIR某些操作係統上的本機服務也支持,例如Linux使用glibc
安全模式除外。
按名稱給出的時區 (通過環境變量TZ, 在tz
函數的參數,例如as.POSIXlt
也許還有係統時區)從當前選擇的‘區域信息’數據庫。
僅在 Windows 上:嘗試(每個會話僅一次)將 Windows 的當前時區概念映射到某個位置,遵循以下版本http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml以及從 Windows 注冊表和文檔中推導出的附加值。可以通過設置來覆蓋它TZ在會話中使用任何 date-times 之前的環境變量。
大多數平台支持以下形式的時區:等/GMT+n' 和 '等/GMT-n’(也可能沒有前綴‘等等/’),假設與 UTC 有固定偏移(因此沒有 DST)。與一些預期相反(但與諸如“PST8PDT’),負偏移量是 UTC 之前(以東)的時間,正偏移量是 UTC 後麵(以西)的時間。
在立法時區出現之前,大多數人根據自己的經度(或附近城鎮的經度)使用時間,稱為“本地平均時間”,縮寫為“LMT’在數據庫中:在許多國家,在轉換為標準時間之前,都會用特定的名稱進行編纂。例如,巴黎於 1891 年將其 LMT 編纂為“巴黎標準時間”(在整個法國大陸使用),並改為“GMT+0” 1911 年。
某些係統(特別是 Linux)具有 tzselect
命令,允許交互式選擇受支持的時區名稱。在使用 systemd
的係統(特別是 Linux)上,操作係統命令 timedatectl list-timezones
將列出所有可用的時區名稱。
警告
(縮寫)時區名稱的字節數有一個係統特定的上限,可以低至 6 個(根據 POSIX 的要求)。某些操作係統允許設置名稱超出其限製的時區,這可能會導致係統崩潰R會議。
有關未來時間的信息是推測性的 (‘proleptic’):數據庫根據民政當局製定的當前規則提供best-known 信息。在 1900 年至 1970 年期間,這些規則(以及頒布了哪些權威規則)通常很模糊,而且數據庫確實經常得到糾正。
OlsonNames
嘗試在已知位置查找奧爾森數據庫。它可能不會成功(當它返回帶有警告的空向量時),即使成功,它也可能無法找到鏈接到的日期時間代碼使用的數據庫R。幸運的是,很少添加名稱,而且大多數數據庫都相當完整。另一方麵,許多與其他命名時區重複的名稱已被移至“落後’ 列表 - 這些被視為可選的,並且在最小安裝中被省略。同樣,文件‘中也有命名的時區後區”僅與 1970 年之前的主要列表中的內容不同 - 這些通常包含在內,但可能不包含在極簡主義係統中。
如何找到係統時區 - 在類 Unix 上
本節對於類似 Unix 的用戶來說具有背景意義,但如果意外返回 NA
值,則可能會有所幫助。
商業 Unixen,例如 Solaris 和 AIX 集TZ,所以當值R已啟動已使用。
所有其他常見平台(Linux、macOS、*BSD)都使用類似的方案,或者源自tzcode
(目前分發自https://www.iana.org/time-zones)或獨立編碼(glibc
,musl-libc
)。此類係統從文件“讀取時區信息”當地時間”,通常在“/ETC’(但可能在‘/usr /本地/等' 或者 '/usr/local/etc/zoneinfo’)。正如通常的 Linux 手冊頁一樣localtime
說
‘因為時區標識符是從’的符號鏈接目標名稱中提取的/etc/當地時間',該文件可能不是普通文件或硬鏈接。'
盡管如此,一些 Linux 發行版(包括引用該引號的發行版)或係統管理員選擇將時區文件複製到“當地時間’。對於非符號鏈接,最終的後備方法是將該文件與時區數據庫中的所有文件進行比較。
一些 Linux 平台提供了另外兩種機製,在查看‘/etc/當地時間’。
-
“現代”Linux 係統使用
systemd
,它提供了設置和檢索時區(除其他外)的機製。有一個命令timedatectl
提供詳細信息。 (不幸的是 RHEL/Centos 6.x 不是‘modern’。) -
Debian-derived係統以來加州2007 年提供了一個文件‘/etc/時區’。它的格式沒有記錄,但根據經驗,它包含一行命名時區的文本。
在每種情況下,都會執行健全性檢查,確保時區名稱是時區數據庫中文件的名稱。 (係統可能使用時區文件(符號鏈接到)‘/etc/當地時間’,但是Sys.timezone
代碼不檢查是否與數據庫中的指定文件相同。這是故意的,因為它們可能來自不同的日期。)
注意
自 2007 年以來,最初旨在節能的夏令時過渡時間變化受到了相當大的幹擾。這些通常會在短時間內通知,並且時區數據庫可能不是最新的。 (2013年,摩洛哥提前一天宣布更改夏令時結束時間;2015年,朝鮮提前一周給出了有關更改的不準確信息。2023年,黎巴嫩出現混亂,當局反複改變主意,一些政策也發生了變化。沒有廣泛實施。)
在具有不區分大小寫的文件係統的平台上,時區名稱將不區分大小寫。它們可能在其他平台上,也可能不在其他平台上,因此,例如,"gmt"
在某些平台上有效,而在其他平台上無效。
請注意,除了替換的情況外,時區的操作都是操作係統服務,甚至在替換的情況下也會使用第三方數據庫並且可以更新(請參閱“時區名稱”部分)。錯誤的結果永遠不會成為R問題,所以請確保你有禮貌,不要責怪R對於他們來說。
例子
Sys.timezone()
str(OlsonNames()) ## typically around six hundred names,
## typically some acronyms/aliases such as "UTC", "NZ", "MET", "Eire", ..., but
## mostly pairs (and triplets) such as "Pacific/Auckland"
table(sl <- grepl("/", OlsonNames()))
OlsonNames()[ !sl ] # the simple ones
head(Osl <- strsplit(OlsonNames()[sl], "/"))
(tOS1 <- table(vapply(Osl, `[[`, "", 1))) # Continents, countries, ...
table(lengths(Osl))# most are pairs, some triplets
str(Osl[lengths(Osl) >= 3])# "America" South and North ...
也可以看看
https://en.wikipedia.org/wiki/Time_zone and https://data.iana.org/time-zones/tz-link.html for extensive sets of links.
https://data.iana.org/time-zones/theory.html for the ‘rules’ of the Olson/IANA database.
相關用法
- R tilde 波形符運算符
- R taskCallback 添加或刪除頂級任務回調
- R toString 將 R 對象轉換為字符串或測試字符串
- R try 嘗試允許錯誤恢複的表達式
- R transform 轉換對象,例如 DataFrame
- R textConnection 文本連接
- R tracemem 對象的跟蹤複製
- R traceback 獲取並打印調用堆棧
- R t 矩陣轉置
- R table 交叉表和表格創建
- R tempfile 為臨時文件創建名稱
- R taskCallbackManager 創建R級任務回調管理器
- R typeof 對象的類型
- R taskCallbackNames 查詢當前內部頂級任務回調名稱
- R trace 函數或方法調用的交互式跟蹤和調試
- R tabulate 向量列表
- R tapply 對不規則數組應用函數
- R trimws 刪除前導/尾隨空格
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Time Zones。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。