Lubridate时区处理

4

我有一个描述中欧夏令时间日期和时间的字符串: "2021-09-23 12:00:00"。 事实上,我有一整列这样的时间点。 由于某些原因,我必须使用'lubridate'包中的函数处理这些时间。使用'as_datetime'函数,我可以得到:

t0 = "2021-09-23 12:00:00"
t1 = as_datetime(t0); t1
## [1] "2021-09-23 12:00:00 UTC"

也就是说,as_datetime函数使用给定的小时和分钟,并添加世界标准时间"UTC"作为时区。而提供时区CEST则会产生不同的结果。
t1 = as_datetime(t0, tz = "CEST"); t1
## [1] "2021-09-23 10:00:00 CEST"

也就是说,改变了时间,这不是我想要的。

我想要得到的(我真正需要的)是“2021-09-23 12:00:00 CEST”,也就是只改变时区而不改变时间。

我尝试了force_tzwith_tz,但那也不起作用。

我还想知道的是为什么'lubridate'会将12:00:00 UST转换为10:00:00 CEST,因为CEST与GMT+2相同,而UTC是GMT+0,所以结果实际上应该相反。

感谢任何帮助。


当我在 R 4.2.1 Windows 和 lubridate 1.8.0 上尝试问题中的代码时,我收到一个警告消息 *In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'CEST'*。 - G. Grothendieck
@G.Grothendieck -- 在Linux、R 4.2.1和lubridate 1.8.0上,当我使用as_datetime(t0, tz="")时,它会自动返回"2021-09-23 12:00:00 CEST",因此系统似乎知道CEST是什么,以及这是我现在的时区。我不知道为什么在MS Windows上会有所不同。 - Hans W.
1个回答

2

尝试:

t0 = "2021-09-23 12:00:00"


library(lubridate)
#1 

t1 = as_datetime(t0, tz = "Europe/Berlin")
[1] "2021-09-23 12:00:00 CEST"

or

#2
t1 = as_datetime(t0, tz = "CST6CDT")

[1] "2021-09-23 12:00:00 CDT"

1
你的提示很有用。使用 with_tz(t1, "Europe/Berlin") 可以将时间转换为所在新时区的正确时间 - 而使用 "CEST" 并不改变时间,只更改时区。尽管 'lubridate' 在 Linux 上识别 CEST 作为时区,但在不同时区之间转换时间时,它处理不正确! - Hans W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接