当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R timezones 时区


R语言 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 规范(在环境变量下列出)TZhttps://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 ...

也可以看看

Sys.timeas.POSIXlt

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-devel大神的英文原创作品 Time Zones。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。