DateTimeClasses
位于 base
包(package)。 说明
表示日历日期和时间的类 "POSIXlt"
和 "POSIXct"
的说明。
用法
## S3 method for class 'POSIXct'
print(x, tz = "", usetz = TRUE, max = NULL, ...)
## S3 method for class 'POSIXct'
summary(object, digits = 15, ...)
time + z
z + time
time - z
time1 lop time2
参数
x , object |
要从日期时间类之一打印或汇总的对象。 |
tz , usetz |
对于时区格式,传递给 |
max |
numeric 或 |
digits |
计算的有效位数:应该足够高以准确表示最不重要的时间单位。 |
... |
从其他方法传递或向其他方法传递的进一步参数。 |
time |
日期时间对象 |
time1 , time2 |
日期时间对象或字符向量。 (字符向量由 |
z |
数值向量(以秒为单位) |
lop |
|
细节
有两类基本的日期/时间。类 "POSIXct"
表示自 1970 年初(UTC 时区)以来的(有符号)秒数,作为数值向量。类 "POSIXlt"
内部是向量的 list
,其组件名为 sec
、 min
、 hour
表示时间, mday
、 mon
和 year
表示日期; wday
、 yday
表示星期几和一年中的某一天, isdst
,夏令时标志,有时(均为可选) zone
,表示时区的字符串,以及 gmtoff
,与 GMT 的偏移量(以秒为单位),请参阅下面的“POSIXlt 详细信息”部分了解更多详细信息。
这些类对应于“日历时间”的 POSIX/C99 结构(time_t
数据类型,“ct”)和“本地时间”(或broken-down时间,“结构tm’数据类型,“lt”),它们也继承了它们的名称。
"POSIXct"
更方便包含在数据帧中,而 "POSIXlt"
更接近人类可读的形式。存在一个虚拟类"POSIXt"
,这两个类都从该虚拟类继承:它用于允许诸如减法之类的操作来混合这两个类。
这两个类都可以进行逻辑比较和一些算术运算。可以在日期时间对象中添加或减去秒数,但不能添加两个日期时间对象。两个日期时间对象相减相当于使用 difftime
。请注意,除非指定时区,否则 "POSIXlt"
对象将被解释为位于这些操作的当前时区。
这两个类都可能有一个属性 "tzone"
,指定时区。但请注意,它们的含义有所不同,请参阅下面的“时区”部分了解更多详细信息。
不幸的是,时区和闰秒的操作使转换变得复杂(根据这个版本)R的数据,到目前为止 27 天已经有 86401 秒长,最后一次是在(实际上是之前)2017-01-01:额外秒数的时间在对象中.leap.seconds
)。如果可能的话,此细节将委托给操作系统服务。似乎一些罕见的系统曾经使用闰秒,但所有已知的当前平台都忽略它们(按照 POSIX 的要求)。这是在构建时检测到并纠正的,所以"POSIXct"
使用次数R在任何平台上都不包括闰秒。
在 "POSIXlt"
对象上使用 c
会将它们转换为当前时区,在 "POSIXct"
对象上使用 "tzone"
属性(如果它们不相同)。
有几次有具体问题。首先,忽略闰秒,而实时时间例如"2005-12-31 23:59:60"
(可能)被视为下一秒。然而,它们永远不会由R,并且不太可能作为输入出现。其次,在某些操作系统上,POSIX/C99 标准存在问题"1969-12-31 23:59:59 UTC"
,即-1
在日历时间中,该值在那些操作系统上也用作错误代码。因此as.POSIXct("1969-12-31
23:59:59", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
可能会给NA
, 因此as.POSIXct("1969-12-31 23:59:59",
tz = "UTC")
会给"1969-12-31 23:59:00"
。其他操作系统(包括使用的代码R在 Windows 上)单独报告错误,因此能够将该时间视为有效时间。
打印方法遵循 options("max.print")
。
时区
"POSIXlt"
对象通常有一个属性"tzone"
,长度为 3 的字符向量,给出时区名称(来自TZ环境变量或参数tz
的函数创建"POSIXlt"
物体;""
标记当前时区)以及基准时区和备用(夏令时)时区的名称。有时这可能只是长度为一,给出base timezones姓名。
"POSIXct"
对象还可以具有属性 "tzone"
,即长度为 1 的字符向量。如果设置为非空值,它将确定如何将对象转换为类"POSIXlt"
,特别是如何打印它。这通常是可取的,但如果您想指定特定时区的对象但要在当前时区打印,您可能需要删除 "tzone"
属性。
有关 POSIXlt 的详细信息
类 "POSIXlt"
内部是一个名为 list
的向量,表示 date-times,具有以下列表组件
sec
-
0-61:秒,允许闰秒。
min
-
0-59:分钟。
hour
-
0-23:小时。
mday
-
1-31:一月中的某一天
mon
-
0-11:年初之后的几个月。
year
-
自 1900 年以来。
wday
-
每周 0-6 天,从周日开始。
yday
-
0-365:一年中的第几天(365 仅适用于闰年)。
isdst
-
夏令时标志。如果有效则为正值,如果无效则为零,如果未知则为负值。
zone
-
(可选。)当时有效的时区缩写:
""
(如果未知)(但""
也可能用于 UTC)。 gmtoff
-
(可选。)与 GMT 的偏移量(以秒为单位):正值表示子午线以东。通常
NA
表示未知,但0
可能表示未知。
组件必须按此顺序排列:在之前仅进行了最低程度的检查R4.3.0。所有对象创建于R4.3.0有可选组件。从早期版本R,最后两个组件在 UTC 中不会出现,并且依赖于平台。现在gmtoff
几乎所有当前平台上都有设置:基于 BSD 或glibc
(包括 Linux 和 macOS)以及使用tzcode
实施附带R(包括 Windows 和默认的 macOS)。
请注意,内部列表结构有些隐藏,因为许多方法(包括 length(x)
、 print()
和 str()
)适用于抽象日期时间向量,就像 "POSIXct"
一样。可以通过具有两个索引的 [
索引来提取和替换单个组件(请参阅示例)。
"POSIXlt"
的分量是 integer
向量,除了 sec
( double
) 和 zone
( character
)。然而,大多数用户会将第一个条的数值强制为实数,并将其余条zone
强制为整数。
组件 wday
和 yday
仅供参考,不用于转换为日历时间,也不用于打印 format()
或 as.character()
。
然而,需要组件 isdst
来区分 DST 结束时的时间:通常凌晨 1 点到凌晨 2 点会出现两次,第一次在 DST 中,然后在标准时间中。在所有其他时间,isdst
都可以从前六个值推断出来,但如果设置不正确,则行为取决于平台。例如,Linux/glibc 在检查时修复了支持 DST 的时区中的错误值,但在没有 DST 的时区中给出了 1
值错误。
对于 “ragged” 和超出范围与 “balanced” "POSIXlt"
对象,请参阅 balancePOSIXlt()
。
Sub-second 准确度
类 "POSIXct"
和 "POSIXlt"
能够表达秒的几分之一,后者允许更高的精度。因此,两种形式之间的分数转换可能不准确,但精度优于微秒。
仅当设置了 options("digits.secs")
时才打印秒小数部分:请参阅 strftime
。
时间的有效范围
"POSIXlt"
类可以表示非常广泛的时间(最多数十亿年),但此类时间只能参考时区来解释。
时区的概念最早于 19 世纪被采用,公历于 1582 年引入,但直到 1927 年才得到普遍采用。操作系统服务几乎总是采用公历,并且可能假定该位置首次制定的时区于该日期之前生效。 (最早的立法时区似乎是 1847 年 12 月 1 日的伦敦。)一些操作系统根据时区内某个位置的经度假定以前使用的“本地时间”。
大多数操作系统将 POSIXct
表示为 C 类型 long
。这意味着在 32 位操作系统上,这涵盖了 1902 年到 2037 年期间。在所有已知的 64 位平台上以及我们在 32 位 Windows 上使用的代码,可表示时间的范围是数十亿年:但是,并非所有平台都可以正确转换 1902 年之前或 2037 年之后的时间。一些愚昧的操作系统使用无符号类型,因此无法表示 1970 年之前的时间。
在可能的情况下检测平台限制,并且在限制之外我们使用我们自己的 C 代码。这使用 1902 年使用的 GMT 偏移量(当时没有 DST)或预测的 2030 年至 2037 年之一(选择以便可能的 DST 过渡日为星期日),并使用备用(夏令时)时间仅当 isdst
为正时或(如果 -1
)如果预计 DST 将于当天在 2030 年代开始运行,则区域。
请注意,有些地方(例如罗马)与 UTC 的偏移量在 1902 年之前的年份中有所不同,并且只有在操作系统支持的情况下才能正确处理这些情况。
没有理由认为 DST 规则在未来将保持不变:美国于 2005 年立法,从 2007 年起更改其规则,未来可能会恢复原样。因此,未来一两年以上的转换是推测性的。其他国家/地区已在提前几天通知后更改了其规则(事实上,如果使用夏令时)。因此,未来日期的表示和转换是暂定的。这也适用于时区数据库 in-use 版本之后的日期 - 并非所有平台都会使其保持最新,其中包括旧版本的R使用地点(Windows 和 macOS 上默认使用)。
警告
一些Unix-like系统(尤其是Linux系统)没有环境变量TZ设置,但有内部代码期望它(就像 POSIX 一样)。我们已尝试解决此问题,但如果您得到意外结果,请尝试设置TZ.看Sys.timezone
以获得有效的设置。
比较 "POSIXlt"
类的对象时需要非常小心。组件和属性不仅是可选的,而且是可选的。几个组件可能具有“尚未确定”的值,并且在不同时区表示的同一时间看起来会完全不同。
"POSIXlt"
对象的列表组件的顺序不得更改,因为一些基于 C 的转换方法依赖于顺序来提高效率。
例子
## IGNORE_RDIFF_BEGIN
(z <- Sys.time()) # the current date, as class "POSIXct"
Sys.time() - 3600 # an hour ago
as.POSIXlt(Sys.time(), "GMT") # the current time in GMT
format(.leap.seconds) # the leap seconds in your time zone
print(.leap.seconds, tz = "PST8PDT") # and in Seattle's
## IGNORE_RDIFF_END
## look at *internal* representation of "POSIXlt" :
leapS <- as.POSIXlt(.leap.seconds)
names(unclass(leapS)) ; is.list(leapS)
## str() on inner structure needs unclass(.):
utils::str(unclass(leapS), vec.len = 7)
## show all (apart from "tzone" attr):
data.frame(unclass(leapS))
## Extracting *single* components of POSIXlt objects:
leapS[1 : 5, "year"]
leapS[17:22, "mon" ]
## length(.) <- n now works for "POSIXct" and "POSIXlt" :
for(lpS in list(.leap.seconds, leapS)) {
ls <- lpS; length(ls) <- 12
l2 <- lpS; length(l2) <- 5 + length(lpS)
stopifnot(exprs = {
## length(.) <- * is compatible to subsetting/indexing:
identical(ls, lpS[seq_along(ls)])
identical(l2, lpS[seq_along(l2)])
## has filled with NA's
is.na(l2[(length(lpS)+1):length(l2)])
})
}
参考
Ripley, B. D. and Hornik, K. (2001). “Date-time classes.” R News, 1(2), 8-11. https://www.r-project.org/doc/Rnews/Rnews_2001-2.pdf.
也可以看看
Dates 适用于没有时间的日期。
as.POSIXct
和 as.POSIXlt
用于类之间的转换。
strptime
用于与字符表示形式之间的转换。
Sys.time
将时钟时间作为 "POSIXct"
对象。
difftime
用于时间间隔。
balancePOSIXlt()
用于平衡或填充 “ragged” POSIXlt 对象。
cut.POSIXt
、 seq.POSIXt
、 round.POSIXt
和 trunc.POSIXt
用于这些类的方法。
weekdays
方便提取函数。
相关用法
- R Dates 日期类别
- R Defunct 将对象标记为已失效
- R Deprecated 将对象标记为已弃用
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
- R warning 警告信息
- R rapply 递归地将函数应用于列表
- R basename 操作文件路径
- R with 评估数据环境中的表达式
- R formals 访问和操纵形式参数
- R icuSetCollate 按 ICU 设置整理
- R search 给出 R 对象的搜索路径
- R gzcon 通过连接(解)压缩 I/O
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Date-Time Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。