格式化Sys.time()的与时区使用输出中的R * format.Posix
我试图找出如何的Sys.time()
输出格式化R.格式化Sys.time()的与时区使用输出中的R * format.Posix
例如:
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"
?
尽管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"
感谢您的答案。我确实有一些疑问:为什么当明确地使用“UTC + 02:00”时,它默认为UTC(因为它不在OlsonNames()中),但实际上移除了两个小时?另外,有没有办法让其他“OlsonNames”格式的时区格式化? – lucacerone
我的另一个使用案例是我经常给予时间戳(以1970-01-01在UTC中的秒数)和格式为“GMT + 01:00”的时区。在某些情况下,还有诸如“GMT + 08:30”之类的时区,我需要处理这些情况以获取当地时间,我如何在R – lucacerone
你认为你可以使用“随机”输入区自变量。你不能。坚持'命名'时区(如'欧洲/斯德哥尔摩')。未知/未知参数导致(静默)UTC设置。 –
但是为什么'format(Sys.time(),format =“%F%R%Z”,tz =“我不知道”)'return'“2017-07-26 15:50”'而不是' “2017-07-26 15:50 CEST”'? – Florian
谢谢,但有时在输出中包括时区的不一致行为,有时会让我感到困惑,有时会将其排除在外。例如,'format(Sys.time(),format =“%F%R%Z”,tz =“aaaaaa b”)'返回'“2017-07-26 15:55 aaaaaa”',虽然它是平等的垃圾,因为'我不知道'。不是我正在计划搞时区。 – Florian