ISO 8601格式的当前时间

18

为了记录日志,一个R脚本如何获取当前日期和时间(UTC时区),并以ISO 8601格式的字符串呈现,格式如下:

2015-12-31T14:26:56.600374+00:00

as.POSIXlt似乎是解决方案,文档声称它接受一个格式参数,但我无法使其在R版本3.1.3上工作:

> as.POSIXlt(Sys.time(), "UTC", "%Y-%m-%dT%H:%M:%S")
[1] "2015-04-08 14:37:58 UTC"
> as.POSIXlt(Sys.time(), tz="UTC", format="%Y-%m-%dT%H:%M:%S")
[1] "2015-04-08 14:38:02 UTC"
> as.POSIXct(Sys.time(), tz="UTC", format="%Y-%m-%dT%H:%M:%S")
[1] "2015-04-08 11:38:22 BRT"
2个回答

28

as.POSIXlt(以及as.POSIXct)用于输入。 用formatstrftime输出。 有关格式字符串的详细信息,请参见?strftime:

 tm <- as.POSIXlt(Sys.time(), "UTC")
 strftime(tm , "%Y-%m-%dT%H:%M:%S%z")
#[1] "2015-04-08T15:11:22+0000"
as.POSIXlt的第三个参数format,用于解析参数一中的字符串。由于我们传入的是来自Sys.time的日期值,因此format被忽略。

我认为时区输出中的冒号并不是ISO 8601格式的要求,但我可能在这一点上是错误的。帮助页面上说标准是POSIX 1003.1。如果需要,可能需要使用正则表达式进行替换以添加冒号。

在查看http://dotat.at/tmp/ISO_8601-2004_E.pdf后,我发现“基本格式”中没有时区表示中的冒号,而在“扩展格式”中有冒号。


2
哦,这很有道理。但是,“as.POSIXlt”的“format”(第三个)参数似乎没有什么区别。即使更改它,甚至删除时间部分,输出也没有变化。这似乎可以工作:strftime(as.POSIXlt(Sys.time(),“UTC”),“%Y-%m-%dT%H:%M:%S%z”)。 - Fernando Correia
2
没错。你的代码和我写的差不多,只是你省略了中间变量的创建。当你使用无名参数位置匹配时,它会将我们给定的数值与 as.POSIXlt.POSIXct 函数的 "..." 参数进行匹配。然后它基本上忽略了它。它不会传递给内部函数。 - IRTFM
1
@7yl4r 谢谢。你说得很对,我的早期代码在“日期”类值的上下文中有一个多余的参数。 - IRTFM
格式 "%Y-%m-%dT%H:%M:%S%z" 似乎介于基本和扩展的 ISO 格式之间。日期和时间部分有标点符号,但时区偏移量没有。这被 SQL Server 拒绝作为 datetimeoffset 数据类型的有效日期/时间。在这种情况下,建议使用正则表达式替换将冒号添加到偏移量中。我希望能够得到一个有效的示例。 - sch56
这似乎适用于 x 以上述格式出现的情况:sub('(+[0-9]{2})([0-9]{2}$)','\\1:\\2', x , fixed=FALSE) - sch56
显示剩余2条评论

7

parsedate可以识别和解析各种格式的日期,包括所有的ISO 8601格式:

format_iso_8601(Sys.time())
# [1] "2017-09-01T10:59:22+00:00"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接