【问题标题】:Formatting the output of Sys.time() with timezone in R using format.Posix*使用 format.Posix* 在 R 中使用时区格式化 Sys.time() 的输出
【发布时间】:2018-01-02 01:20:47
【问题描述】:

我想弄清楚如何在 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"

【问题讨论】:

  • 您假设您可以对时区参数使用“随机”输入。你不能。坚持使用“命名”时区(例如“欧洲/斯德哥尔摩”)。未识别/未知的参数会导致(静默)UTC 设置。
  • 但是为什么format(Sys.time(), format = "%F %R %Z", tz = "I have no clue")返回"2017-07-26 15:50 "而不是"2017-07-26 15:50 CEST"
  • 谢谢,但我仍然对有时在输出中包含时区和有时将其排除在外的不一致行为感到有些困惑。例如,format(Sys.time(), format = "%F %R %Z", tz = "aaaaaa b") 返回"2017-07-26 15:55 aaaaaa",尽管它与“我不知道”一样垃圾。并不是说我打算搞乱时区。
  • 奇怪,这正是我在控制台中输入的内容。好吧,我不会在这个问题的非问题版本上浪费你的时间了。 ;)

标签: r date formatting timezone format


【解决方案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"

【讨论】:

  • 感谢您的回答。不过我确实有一些疑问:为什么当明确使用“UTC+02:00”时它不会默认为 UTC(因为它不在 OlsonNames() 中)但实际上删除了两个小时?另外,有没有办法将时区格式化为其他“OlsonNames”有效格式?
  • 我的另一个用例是,我经常得到时间戳(UTC 时间从 1970 年 1 月 1 日开始的秒数)和“GMT+01:00”等格式的时区。在某些情况下,还有像“GMT+08:30”这样的时区,我需要处理这种情况才能获得当地时间,我该如何在 R
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 2021-11-15
  • 2018-01-24
  • 2012-10-15
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多