在lubridate中转换unix时区时出现问题

在lubridate中转换unix时区时出现问题,r,lubridate,R,Lubridate,我以JSON格式从数据导入数据集,然后使用Lubridate函数“as_datetime”将unix时间列转换为标准时间。 我将tz(时区)设置为GMT+7,就像我在泰国曼谷一样,并在分析中使用转换日期时间。后来,我发现它是错误的,对于正确的日期时间,我必须输入tz作为“GMT-7”。我不明白为什么 as_datetime(1565923100) #[1] "2019-08-16 02:38:20 UTC" as_datetime(1565923100, tz = "gmt+7") #[1]

我以JSON格式从数据导入数据集,然后使用Lubridate函数“as_datetime”将unix时间列转换为标准时间。 我将tz(时区)设置为GMT+7,就像我在泰国曼谷一样,并在分析中使用转换日期时间。后来,我发现它是错误的,对于正确的日期时间,我必须输入tz作为“GMT-7”。我不明白为什么

as_datetime(1565923100)
#[1] "2019-08-16 02:38:20 UTC"

as_datetime(1565923100, tz = "gmt+7")
#[1] "2019-08-15 19:38:20 gmt"

as_datetime(1565923100, tz = "gmt-7")
#[1] "2019-08-16 09:38:20 gmt"

now()
#[1] "2019-08-16 10:16:17 +07"

根据代码,gmt-7给出了正确的时间,而我认为我应该使用gmt+7,因为曼谷时区是gmt+7。我使用“now”功能进行检查,也得到了正确的时间。我不明白代码背后的逻辑。感谢您的解释。

指定时区的正确方法是将
指定为日期时间(1565923100,tz=“亚洲/曼谷”)
as_datetime(1565923100,tz=“gmt+7”)
as_datetime(1565923100,tz=“gmt-7”)
是不正确的方式,在as.POSIXlt.POSIXct(x,tz)中显示警告
:未知时区“gmt+7”
?strtime-“与gmt(也称为UTC)的偏移量是时区和类“POSIXct”之间的转换的一部分,但由于它们经常计算不正确而造成困难。它们通常与时区规范具有相反的符号(请参见“Sys.timezone”):正值位于子午线以东@RonakShah-您可以指定偏移量,但必须正确使用字符串:
as_datetime(1565923100,tz=“Etc/gmt+7”)
@我看到的最新邮件..我不知道。虽然我仍然不清楚为什么将gmt时间和日期时间分别增加7小时和15小时减去7,尽管有
未知时区
@Ronaksah-这是令人惊讶的-它似乎处于
as.POSIXct
的级别,而不是lubridate中的任何东西-请参见
as.POSIXct(156592300,tz=“-7”,origin=“1970-01-01”)
指定时区的正确方法是
as\u datetime(1565923100,tz=“Asia/曼谷”)
作为日期时间(1565923100,tz=“gmt+7”)
作为日期时间(1565923100,tz=“gmt-7”)
是不正确的方式,在as.POSIXlt.POSIXct(x,tz)中显示警告
:未知时区“gmt+7”
?strtime
-“与gmt的偏移量(也称为UTC)是时区和类“POSIXct”之间的转换的一部分,但由于它们经常计算不正确而造成困难。它们通常与时区规范具有相反的符号(请参见“Sys.timezone”):正值位于子午线以东@RonakShah-您可以指定偏移量,但必须正确使用字符串:
as_datetime(156592300,tz=“Etc/gmt+7”)
@我看到的最新邮件..我不知道这一点。尽管我仍然不清楚为什么
as_datetime(1565923000,tz=“gmt-7”)
在gmt时间上加7小时,而
as_datetime(156592300,tz=“gmt+7”)
减去7,尽管有
未知时区
@Ronaksah-这是令人惊讶的-它似乎处于
as.POSIXct
的级别,而不是lubridate中的任何级别-参见
as.POSIXct(156592300,tz=“-7”,origin=“1970-01-01”)