strptime
位于 base
包(package)。 说明
在字符表示和表示日历日期和时间的 "POSIXlt"
和 "POSIXct"
类的对象之间进行转换的函数。
用法
## S3 method for class 'POSIXct'
format(x, format = "", tz = "", usetz = FALSE, ...)
## S3 method for class 'POSIXlt'
format(x, format = "", usetz = FALSE,
digits = getOption("digits.secs"), ...)
## S3 method for class 'POSIXt'
as.character(x, digits = if(inherits(x, "POSIXlt")) 14L else 6L,
OutDec = ".", ...)
strftime(x, format = "", tz = "", usetz = FALSE, ...)
strptime(x, format, tz = "")
参数
x |
要转换的对象: |
tz |
指定用于转换的时区的字符串。系统特定(请参阅 |
format |
一个字符串。如果任何元素具有非午夜的时间分量,则 |
... |
从其他方法传递或向其他方法传递的进一步参数。 |
usetz |
合乎逻辑的。时区缩写是否应该附加到输出中?这是在打印时使用的,比使用 |
digits |
需要时确定秒数的 |
OutDec |
指定要使用的小数点的 1 个字符的字符串;默认值不是故意的 |
细节
format
和 as.character
方法以及 strftime
将对象从类 "POSIXlt"
和 "POSIXct"
转换为 character
向量。
strptime
将字符向量转换为类 "POSIXlt"
:其输入 x
首先由 as.character
转换。每个输入字符串都会根据指定的格式进行必要的处理:任何尾随字符都会被忽略。
strftime
是一个包装器format.POSIXlt
,并且它和format.POSIXct
首先转换为类"POSIXlt"
通过调用as.POSIXlt
(所以他们也为类工作"Date"
)。请注意,只有该转换取决于时区。自从R版本4.2.0,as.POSIXlt()
转换现在处理非有限数字-Inf
,Inf
,NA
和NaN
不同的是(以前所有的都被视为NA
)。还有format()
方法用于POSIXlt
现在将这些不同的非有限时间和日期视为类似于类型double
.
通常的向量回收规则适用于 x
和 format
,因此答案将是这些向量中较长者的长度。
在适当且可用的情况下使用 Locale-specific 与字符串之间的转换。这会影响日期和月份的名称、AM/PM 指示器(如果使用)以及输出格式中的分隔符,例如%x
和%X
,通过的设置LC_TIME
语言环境类别。说明的“当前区域设置”可能意味着在开始时使用的区域设置R会话或首次使用这些函数时。 (对于输入,locale-specific 转换可以通过调用来更改Sys.setlocale
有类别LC_TIME
(或者LC_ALL
)。对于输出,发生的情况取决于操作系统,但通常有效。)
格式的详细信息是特定于平台的,但以下内容可能会广泛使用:大多数是由 POSIX 标准定义的。转换规范由 %
引入,通常后跟一个字母或 O
或 E
后跟一个字母。格式字符串中不属于转换规范的任何字符均按字面解释(并且 %%
给出 %
)。广泛实施的转换规范包括
%a
-
该平台当前区域设置中工作日的缩写名称。 (还匹配输入的全名:在某些语言环境中没有名称缩写。)
%A
-
当前区域设置中的完整工作日名称。 (也匹配输入上的缩写名称。)
%b
-
该平台当前区域设置中月份名称的缩写。 (还匹配输入的全名:在某些语言环境中没有名称缩写。)
%B
-
当前区域设置中的完整月份名称。 (也匹配输入上的缩写名称。)
%c
-
日期和时间。输出为Locale-specific,输入为
"%a %b %e %H:%M:%S %Y"
。 %C
-
世纪(00-99):年份的整数部分除以100。
%d
-
十进制数形式的月份日期 (01-31)。
%D
-
日期格式,例如
%m/%d/%y
:C99 标准表示它应该是这种确切的格式(但并非所有操作系统都遵守)。 %e
-
十进制数 (1-31) 表示的月份中的日期,前导空格表示 single-digit 数字。
%F
-
相当于 %Y-%m-%d(ISO 8601 日期格式)。
%g
-
基于周的年份的最后两位数字(请参阅
%V
)。 (已接受但在输入时被忽略。) %G
-
以周为单位的年份(请参阅
%V
)为十进制数。 (已接受但在输入时被忽略。) %h
-
等效于
%b
。 %H
-
十进制数形式的小时 (00-23)。作为特殊的异常字符串,例如‘24:00:00’ 被接受作为输入,因为 ISO 8601 允许这些。
%I
-
十进制数形式的小时 (01-12)。
%j
-
十进制数形式的一年中的日期 (001-366): 对于输入,366 仅在闰年有效。
%m
-
十进制数形式的月份 (01-12)。
%M
-
分钟为十进制数 (00-59)。
%n
-
输出换行,输入任意空格。
%p
-
区域设置中的 AM/PM 指示器。与
%I
结合使用,而不是与%H
结合使用。某些语言环境中的空字符串(例如,在某些操作系统、包括俄罗斯在内的非英语欧洲语言环境中)。如果用于此类区域设置中的输入,则行为未定义。某些平台接受
%P
进行输出,它使用小写版本(%p
也可能使用小写):其他平台将输出P
。 %r
-
对于输出,12 小时时钟时间(使用区域设置的 AM 或 PM):仅在某些区域设置中定义,并且在未定义 AM/PM 指示符的区域设置中的某些操作系统上会产生误导。对于输入,相当于
%I:%M:%S %p
。 %R
-
等效于
%H:%M
。 %S
-
第二个为整数 (00-61),最多允许两个 leap-seconds(但 POSIX-compliant 实现将忽略闰秒)。
%t
-
输出上使用制表符,输入上使用任意空格。
%T
-
等效于
%H:%M:%S
。 %u
-
十进制数形式的工作日(1-7,星期一为 1)。
%U
-
一年中的第几周,以十进制数 (00-53) 表示,使用星期日作为一周的第一天(通常将一年中的第一个星期日作为第一周的第一天)。美国大会。
%V
-
一年中的第几周,采用 ISO 8601 中定义的十进制数 (01-53)。如果包含 1 月 1 日的周(从星期一开始)在新的一年中有四天或更多天,则将其视为第 1 周。否则,将其视为第 1 周。上一年的最后一周,下一周是第一周。(接受但忽略输入。)
%w
-
工作日为十进制数(0-6,星期日为 0)。
%W
-
一年中的第几周,以十进制数 (00-53) 表示,使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第一周的第一天)。英国大会。
%x
-
日期。输出为Locale-specific,输入为
"%y/%m/%d"
。 %X
-
时间。输出为Locale-specific,输入为
"%H:%M:%S"
。 %y
-
无世纪的年份 (00-99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀 - 这是 2018 POSIX 标准指定的行为,但它也表示“预计在未来版本中,默认世纪从 2 推断” -数字年份将会改变'。
%Y
-
年与世纪。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC):请参阅 https://en.wikipedia.org/wiki/0_(year) 。然而,该标准还规定,其历法中1582年之前的年份只能在相关各方同意的情况下使用。
对于输入,仅接受年份
0:9999
。 %z
-
与 UTC 的小时和分钟的有符号偏移量,所以
-0800
比 UTC 晚 8 小时。 (标准仅适用于输出。适用于输入R目前在所有平台上都支持它 - 值来自-1400
到+1400
被接受。) %Z
-
(仅输出。)时区缩写为字符串(如果不可用则为空)。当时区缩写多年来发生变化时,这可能不可靠。
显示前导零的地方将在输出中使用,但在输入中是可选的。名称在输入时匹配 case-insensitively:输出时名称是否大写取决于平台和区域设置。请注意,缩写名称是特定于平台的(尽管标准在‘C' 语言环境 它们必须是大写英文名称的前三个字母:此约定广泛用于 English-language 语言环境,但例如法语月份缩写在 Linux、macOS、Solaris 和 Windows 中的任何两个上都不相同)。如果您想使用缩写,那么了解缩写至关重要%a
,%b
或者%h
作为输入格式的一部分:请参阅示例以了解如何检查。
当 %z
或 %Z
用于具有指定时区的对象的输出时,系统会尝试使用该时区的值 — 但不保证成功。
%n
和 %t
的 ‘whitespace’ 的定义取决于平台:对于大多数来说,它不包含不间断空格。
不在标准中且实施较少的是
%k
-
24 小时制时间,单位数字前面有一个空格。
%l
-
12 小时制时间,单位数字前面有一个空格。
%s
-
(仅限输出。)自纪元以来的秒数。
%+
-
(仅输出。)类似于
%c
,通常是"%a %b %e %H:%M:%S %Z %Y"
。可能取决于区域设置。
对于输出,还有%O[dHImMUVwWy]
,它可以以替代的locale-dependent格式(例如,罗马数字)发出数字,以及%E[cCyYxX]
,它可以使用替代的‘era’(例如,不同的宗教日历)。其中受支持的是OS-dependent。这些被接受作为输入,但具有标准解释。
具体到R是%OSn
,对于输出,将秒数截断为0 <= n <= 6
小数位(如果%OS
后面没有数字,它使用的设置getOption("digits.secs")
,或者如果未设置,n =
0
)。进一步地,对于strptime
%OS
将输入秒,包括秒的小数部分。注意%S
不读取输出的小数部分。
其他转换规范的行为(即使以 %
开头的其他字符序列是转换规范)是特定于系统的。某些系统记录不支持在 format
中使用多字节字符:UTF-8 语言环境不太可能导致问题。
值
format
方法和 strftime
返回表示时间的字符向量。 NA
时间返回为 NA_character_
。
strptime
将字符表示形式转换为类的对象"POSIXlt"
。时区用于设置isdst
组件并设置"tzone"
属性如果tz != ""
。如果指定的时间无效(例如‘“2010-02-30 08:00”’)结果的所有组成部分都是NA
。 (注意:这确实意味着它所说的 - 如果它是一个无效时间,而不仅仅是某个时区中不存在的时间。)
印刷年限
每个人都同意从 1000 到 9999 的年份应该用 4 位数字打印,但标准没有定义在该范围之外要做什么。对于 0 到 999 年,大多数操作系统都会用零或空格填充 4 个字符,但 Linux/glibc 只输出数字。
操作系统设施可能不会打印 1 CE(又名 1 AD)之前的年份‘correctly’(它们倾向于假设存在 0 年:请参阅https://en.wikipedia.org/wiki/0_(year),有些操作系统完全错误)。常见格式为 -45
和 -045
。
9999之后和-999之前的年份通常打印有五个或更多字符。
某些平台支持 POSIX 2008(及其他平台)的修饰符。在 Linux/glibc 上的格式"%04Y"
确保至少四个字符和零填充(默认为无填充)。内部代码(在 Windows 上使用,在 macOS 上默认使用)默认使用零填充(这可以通过环境变量控制)R_PAD_YEARS_BY_ZERO)。在这些平台上,格式%04Y
,%_4Y
和%_Y
可分别用于零、空格和无填充。 (在 macOS 上,本机代码(非默认)不支持这些,并使用零填充到 4 位数字。)
时区偏移
与 GMT(也称为 UTC)的偏移是时区之间以及与 "POSIXct"
类之间转换的一部分,但会造成困难,因为它们通常计算不正确。
它们通常具有与时区规范相反的符号(请参阅Sys.timezone
):正值位于子午线以东。尽管有些时区存在偏移量,如 +00:09:21(1900 年的巴黎)和 -00:44:30(利比里亚,直到 1972 年),但偏移量通常被视为整数分钟,并且最常见于RFC 5322 电子邮件标头采用 -0800
等形式(例如,冬季在美国太平洋海岸使用)。
格式 %z
可用于输入或输出:它是一个字符串,通常是加号或减号,后跟两位数字表示小时,两位数字表示分钟:标准规定,如果偏移量不确定,则应输出空字符串,但是某些系统使用 +0000
或当年使用的时区的偏移量。 (在某些平台上,转换为 "POSIXct"
后效果更好。某些平台仅识别小时或 half-hour 输出偏移量。)
使用 %z
作为输入对于 tz = "UTC"
最有意义。
来源
输入使用 POSIX 函数 strptime
并输出 C99 函数 strftime
。
然而,并非所有操作系统(尤其是 Windows)都提供strptime
那些这样做的人发现了很多问题,所以自 2000 年以来R使用了来自‘的代码分支glibc’。分叉的代码使用系统的strftime
查找 locale-specific 日期和月份名称以及任何 AM/PM 指示器。
在某些平台上(包括 Windows,默认情况下在 macOS 上)系统的strftime
被 IANA 修改的代码替换(以及 C-level 日期时间代码的大部分其余部分)tzcode' 分配 (https://www.iana.org/time-zones)。
请注意,由于 strftime
用于输出(而不是 wcsftime
),因此如果需要将参数 format
转换为会话编码。
注意
默认格式遵循 ISO 8601 国际标准的规则,该标准将一天表示为"2001-02-28"
和一个时间"14:01:02"
像这里一样使用前导零。 (ISO 形式不使用空格,可能是‘T’,分隔日期和时间:R默认情况下使用空格。)
对于strptime
,输入字符串不需要完全指定日期:假设未指定的秒、分钟或小时为零,未指定的年、月或日为当前。 (但是,如果指定了月份,则该月的日期必须由 %d
或 %e
指定,因为该月的当前日期不必对于指定的月份有效。)某些组件可能会返回为 NA
(但未知的tzone
组件由空字符串表示)。
如果指定的时区在您的系统上无效,则发生的情况是特定于系统的,但可能会被忽略。
请记住,在大多数时区,由于与“夏令时”(也称为‘summer’)时间的转换,有些时间不会发生,有些时间会发生两次。 strptime
不会验证此类时间(它不假定特定时区),但 as.POSIXct
的转换会验证此类时间。 strftime
的转换和格式化/打印使用操作系统设施,并且可能会在 DST 转换时返回不存在的时间的无意义结果。
在 C 语言环境中%c
必须是"%a %b %e %H:%M:%S %Y"
。由于 Windows 不符合规定(并且使用北美以外地区无法理解的日期格式),因此该格式被使用R在 Windows 上的所有语言环境中。
生成的每个字符串的长度限制为 2048 个字节strftime
和format
方法。来自R4.3.0 尝试超过此值是一个错误(以前的版本会默默地截断为 255 字节)。
例子
## locale-specific version of date()
format(Sys.time(), "%a %b %d %X %Y %Z")
## time to sub-second accuracy (if supported by the OS)
format(Sys.time(), "%H:%M:%OS3")
## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some non-English locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- strptime(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
(chz <- as.character(z)) # same w/o TZ
## *here* (but not in general), the same as format():
stopifnot(exprs = {
identical(chz, format(z))
grepl("^1960-0[137]-[03][012]$", chz[!is.na(z)])
})
## read in date/time info in format 'm/d/y h:m:s'
dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
x <- paste(dates, times)
z2 <- strptime(x, "%m/%d/%y %H:%M:%S")
z2
## *here* (but not in general), the same as format():
stopifnot(identical(format(z2), as.character(z2)))
## time with fractional seconds
z3 <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
z3 # prints without fractional seconds by default, digits.sec = NULL ("= 0")
op <- options(digits.secs = 3)
z3 # shows the 3 extra digits
as.character(z3) # ditto
options(op)
## time zone names are not portable, but 'EST5EDT' comes pretty close.
z4 <- strptime(c("2006-01-08 10:07:52", "2006-08-07 19:33:02"),
"%Y-%m-%d %H:%M:%S", tz = "EST5EDT")
z4
attr(z4, "tzone")
as.character(z4)
z4$sec[2] <- pi # "very" fractional seconds
as.character(z4) # shows full precision
format(z4) # no fractional sec
format(z4, digits=8) # shows only 6 (hard-wired maximum)
format(z4, digits=4)
## An RFC 5322 header (Eastern Canada, during DST)
## In a non-English locale the commented lines may be needed.
## prev <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
strptime("Tue, 23 Mar 2010 14:36:38 -0400", "%a, %d %b %Y %H:%M:%S %z")
## Sys.setlocale("LC_TIME", prev)
## Make sure you know what the abbreviated names are for you if you wish
## to use them for input (they are matched case-insensitively):
format(s1 <- seq.Date(as.Date('1978-01-01'), by = 'day', len = 7), "%a")
format(s2 <- seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b")
## Non-finite date-times :
format(as.POSIXct(Inf)) # "Inf" (was NA in R <= 4.1.x)
format(as.POSIXlt(c(-Inf,Inf,NaN,NA))) # were all NA
参考
International Organization for Standardization (2004, 2000, ...) ‘ISO 8601. Data elements and interchange formats - Information interchange - Representation of dates and times.’, slightly updated to International Organization for Standardization (2019) ‘ISO 8601-1:2019. Date and time - Representations for information interchange - Part 1: Basic rules’, and further amended in 2022. For links to versions available on-line see (at the time of writing) https://dotat.at/tmp/ISO_8601-2004_E.pdf and https://www.qsl.net/g1smd/isopdf.htm; for information on the current official version, see https://www.iso.org/iso/iso8601 and https://en.wikipedia.org/wiki/ISO_8601.
The POSIX 1003.1 standard, which is in some respects stricter than ISO 8601.
也可以看看
DateTimeClasses 了解日期时间类的详细信息; locales 查询或设置区域设置。
您的系统帮助页面strftime
可以查看如何指定其格式。 (在某些系统上,包括 Windows,strftime
被更全面的内部代码取代。)
相关用法
- R strsplit 分割字符向量的元素
- R strtoi 将字符串转换为整数
- R strrep 重复字符向量的元素
- R strwrap 将字符串换行以设置段落格式
- R strtrim 将字符串修剪为指定的显示宽度
- R structure 属性规范
- R stop 停止函数执行
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R startsWith 字符串是否以另一个字符串开头或结尾?
- R stopifnot 确保 R 表达式的真实性
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R solve 求解方程组
- R scan 读取数据值
- R sprintf 使用 C 风格字符串格式化命令
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R source 从文件、连接或表达式中读取 R 代码
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R split 分组并重新集合
- R slice.index 数组中的切片索引
- R sort 对向量进行排序或排序
- R sequence 创建序列向量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Date-time Conversion Functions to and from Character。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。