使用format.Posix *在R中使用时区格式化Sys.time()的输出

时间:2017-07-26 15:43:24

标签: r date formatting timezone format

我想弄清楚如何格式化R中的Sys.time()输出。

例如:

t <- Sys.time()
print(t)
# [1] "2017-07-26 09:41:29 CEST"

这是正确的。

我想用t制作一个由日期,小时和分钟以及时区组成的字符串。 我可以用

format(t, format = "%F %R %Z")
# [1] "2017-07-26 09:41 CEST"

这是我的期望。

但是,如果我明确设置时区,我很难理解输出。例如:

format(t, format = "%F %R %Z", tz = "Europe/Stockholm")
# [1] "2017-07-26 09:41 CEST"

产生我所期望的,但是:

format(t, format = "%F %R %Z", tz = "CEST")
# [1] "2017-07-26 07:41 CEST"

我认为这是错误的,我希望输出为"2017-07-26 09:41 CEST""2017-07-26 09:41 Europe/Stockholm"

另外

format(t, format = "%F %R %Z", tz = "UTC+02:00")
# [1] "2017-07-26 05:41 UTC"

我发现甚至更奇怪,因为我希望输出为"2017-07-26 10:41 UTC+02:00"

在答案中,我想知道两件事:

  • 为什么我的例子给出了他们给出的输出?
  • 有没有办法让时区总是写成"2017-07-26 10:41 UTC+02:00""2017-07-26 10:41 Europe/Stockholm"

1 个答案:

答案 0 :(得分:1)

即使R在控制台中将时区显示为"CEST"%Z),也没有该名称的有效时区。您可以查看OlsonNames()以获取有效的时区名称。

any(grepl("CEST", OlsonNames()))
#[1] FALSE

对于时区显示为CEST的情况,它仍然在内部存储为"Europe/Stockholm"。我们可以使用dput

进行检查
as.POSIXct("2017-07-26 10:46:12", tz = "Europe/Stockholm")
#[1] "2017-07-26 10:46:12 CEST"

dput(as.POSIXct("2017-07-26 10:46:12", tz = "Europe/Stockholm"))
#structure(1501058772, class = c("POSIXct", "POSIXt"), tzone = "Europe/Stockholm")

请注意%Z仅用于输出,并且输入不可靠。 CEST不是tz的有效值,如果您对tz使用无效值,则通常将其视为UTC(请参阅?format.POSIXct?strptime)。这就是您使用format(t, format = "%F %R %Z", tz = "CEST")

获得意外输出的原因

明确使用"Europe/Stockholm"

any(grepl("Europe/Stockholm", OlsonNames()))
#[1] TRUE

对于特定格式的格式化时间,请尝试

format(as.POSIXct("2017-07-26 10:46:12", tz = "UTC"), "%F %R UTC%z")
#[1] "2017-07-26 10:46 UTC+0000"