2017-07-26 26 views
1

我试图找出如何的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"
+0

你认为你可以使用“随机”输入区自变量。你不能。坚持'命名'时区(如'欧洲/斯德哥尔摩')。未知/未知参数导致(静默)UTC设置。 –

+0

但是为什么'format(Sys.time(),format =“%F%R%Z”,tz =“我不知道”)'return'“2017-07-26 15:50”'而不是' “2017-07-26 15:50 CEST”'? – Florian

+1

谢谢,但有时在输出中包括时区的不一致行为,有时会让我感到困惑,有时会将其排除在外。例如,'format(Sys.time(),format =“%F%R%Z”,tz =“aaaaaa b”)'返回'“2017-07-26 15:55 aaaaaa”',虽然它是平等的垃圾,因为'我不知道'。不是我正在计划搞时区。 – Florian

回答

0

尽管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" 
+0

感谢您的答案。我确实有一些疑问:为什么当明确地使用“UTC + 02:00”时,它默认为UTC(因为它不在OlsonNames()中),但实际上移除了两个小时?另外,有没有办法让其他“OlsonNames”格式的时区格式化? – lucacerone

+0

我的另一个使用案例是我经常给予时间戳(以1970-01-01在UTC中的秒数)和格式为“GMT + 01:00”的时区。在某些情况下,还有诸如“GMT + 08:30”之类的时区,我需要处理这些情况以获取当地时间,我如何在R – lucacerone