在 R 中将具有时区偏移量的日期时间字符串转换为本地时间时出现问题

Issue with converting a date-time string with timezone offset to local time in R

提问人:Vincent Guyader 提问时间:7/26/2023 更新时间:7/27/2023 访问量:47

问:

在 R 中将时区偏移量的日期时间字符串转换为本地时间时,我遇到了困难。我拥有的日期时间字符串采用以下格式:“2021-01-05T09:00:00+01:00”。我想将其转换为偏移量 (+01:00) 指定的时区的本地时间,该时间对应于冬季(CET - 中欧时间)的巴黎时间(欧洲/巴黎)。

我尝试过使用各种方法,包括润滑剂和作为。POSIXct() 替换为 %z 格式。然而,这些尝试并没有产生正确的结果。例如,使用润滑剂时,输出为“2021-01-05 08:00:00 CET”而不是“2021-01-05 09:00:00 CET”。我还尝试使用相同格式的 strptime(),但结果仍然不正确。

这是我到目前为止尝试过的 R 代码:

moment <- "2021-01-05T09:00:00+01:00"
date_obj <- ymd_hms(moment) %>% force_tz(tzone = "Europe/Paris")
print(date_obj)  # Output: "2021-01-05 08:00:00 CET"

moment <- "2021-01-05T09:00:00+01:00"
date_obj <- ymd_hms(moment) %>% with_tz(tzone = "Europe/Paris")
print(date_obj)  # Output: "2021-01-05 09:00:00 CET"

# Using as.POSIXct()
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S%z")
print(date_obj)  # Output: NA

# Using strptime()
moment <- "2021-01-05T09:00:00+01:00"
date_obj <- strptime(moment, format = "%Y-%m-%dT%H:%M:%S%z")
print(date_obj)  # Output: NA

有人可以提供一个清晰准确的解决方案,将此日期时间字符串转换为具有指定时区偏移量的巴黎 (CET) 本地时间吗?任何帮助或建议将不胜感激。

谢谢!

R 润滑剂 Posixct Posixlt

评论

0赞 Vincent Guyader 7/26/2023
似乎有优势 : anytime::anytime(moment,tz =“UTC” ,asUTC = TRUE) %>% with_tz(“欧洲/巴黎”)
0赞 Jon Spring 7/26/2023
lubridate::parse_date_time(moment, "ymd_HMS_z",tz = "Europe/Paris")
1赞 Jon Spring 7/26/2023
问题中的第二种方法有什么问题?这不是你想要的输出吗?
0赞 Vincent Guyader 7/26/2023
事实上,你是绝对正确的。我确信答案应该是上午 10:00 而不是上午 9:00......所有这一切都是因为那个的夏令时。我被我的 Google 日历的显示误导了,它显示的信息不正确。感谢您抽出宝贵时间研究我的问题

答:

2赞 G. Grothendieck 7/26/2023 #1

指定格式(以秒为内)并单独指定时区。不使用任何软件包。

moment <- "2021-01-05T09:00:00+01:00"

as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S", tz = "Europe/Paris")
## [1] "2021-01-05 09:00:00 CET"

as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S", tz = "CET")
## [1] "2021-01-05 09:00:00 CET"

或提取 +01:00 并将其转换为 Etc/GMT-1(注意符号翻转):

as.POSIXct(moment, format = "%Y-%m-%dT%H:%M:%S",
  tz = chartr("+-", "-+", sub(".*([+-])0?(.*):..$", "Etc/GMT\\1\\2", moment)))
## [1] "2021-01-05 09:00:00 +01"

评论

0赞 G. Grothendieck 7/26/2023
添加了第三个选项。