R 时区不同时检查日期是否相等

R 时区不同时检查日期是否相等,r,timezone,R,Timezone,由于我无法解决的原因,我收到了带有奇数时区的R数据 我希望测试数据集中的最新日期是否等于给定日期(例如,当前日期),但是我在(不需要的)时区转换方面遇到问题。即使时区不同,是否有一种自然的方法来测试两个日期字符串是否相同?我不一定知道数据的时区 我想到了两种“解决方案”,但这两种解决方案似乎都是低效的(和限制性的)黑客: 及 其中: > as.Date(date.Syd) [1] "2012-12-10" > unclass(date.Syd) [1] 1355175001 attr

由于我无法解决的原因,我收到了带有奇数时区的R数据

我希望测试数据集中的最新日期是否等于给定日期(例如,当前日期),但是我在(不需要的)时区转换方面遇到问题。即使时区不同,是否有一种自然的方法来测试两个日期字符串是否相同?我不一定知道数据的时区

我想到了两种“解决方案”,但这两种解决方案似乎都是低效的(和限制性的)黑客:

其中:

> as.Date(date.Syd)
[1] "2012-12-10"
> unclass(date.Syd)
[1] 1355175001
attr(,"tzone")
[1] "Australia/Sydney"

> as.Date(date.Ldn)
[1] "2012-12-11"
> unclass(date.Ldn)
[1] 1355266811
attr(,"tzone")
[1] "GMT"
在这种情况下,由于时区转换,日期相等性测试失败(不理想):

> as.Date(date.Syd) == as.Date(date.Ldn)
[1] FALSE
这就是为什么我使用了我丑陋的角色/POSIXlt黑客:

> substr(as.character(date.Syd), 1,10) == substr(as.character(date.Ldn), 1,10)
[1] TRUE

>date.Syd_lt date.Ldn_lt粘贴0(date.Syd_lt$year+1900,“-”,date.Syd_lt$mon+1,“-”,date.Syd_lt$mday)=
+粘贴0(date.Ldn_lt$year+1900,“-”,date.Ldn_lt$mon+1,“-”,date.Ldn_lt$mday)
[1] 真的

如果转换为
日期
,则会丢失时区信息

系统日期如
所示

“Sys.Date”返回当前时区中的当前日期

因此,在给定的时间点,它可能会返回不同的值,具体取决于您所在的时区

> Sys.setenv(TZ="Australia/Sydney")
> d <- Sys.Date()
> d
[1] "2012-12-11"

> Sys.setenv(TZ="America/Los_Angeles")
> Sys.Date()
[1] "2012-12-10"
> d
[1] "2012-12-11"
依我看,
POSIXlt
通常应该避免使用,但如果您确实需要,可以转换为
POSIXlt

> Sys.setenv(TZ="America/Los_Angeles")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.135976 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.137197 EST"

> Sys.setenv(TZ="Australia/Sydney")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.138371 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.13928 EST"

我发现让datetime函数在输入时识别“tz”参数的唯一方法是在使用as.POSIXct之前使用as.POSIXlt:

> date.p5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT+5'))
> date.m5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT-5'))
> date.p5
[1] "2012-12-11 01:02:51 GMT"
> date.m5
[1] "2012-12-11 11:03:05 GMT"

> date.m5C <-  as.POSIXct(Sys.time(), tz = 'GMT-5')
> date.m5C
[1] "2012-12-10 22:08:19 PST"
> date.p5C <-  as.POSIXct(Sys.time(), tz = 'GMT+5')
> date.p5C
[1] "2012-12-10 22:08:44 PST"

> date.l0PST <-  as.POSIXlt(Sys.time(), tz = 'PST')
> date.l0PST
[1] "2012-12-11 06:15:31 UTC"  # My clock reads 22:15:31 Pacific (US) Standard Time
> date.c0PST <-  as.POSIXct(Sys.time(), tz = 'PST')
> date.c0PST
[1] "2012-12-10 22:15:42 PST"
>date.p5 date.m5 date.p5
[1] “2012-12-11 01:02:51格林尼治标准时间”
>date.m5
[1] “2012-12-11 11:03:05格林威治标准时间”
>date.m5C date.m5C
[1] “2012-12-10 22:08:19太平洋标准时间”
>date.p5C date.p5C
[1] “2012-12-10 22:08:44太平洋标准时间”
>date.l0PST date.l0PST
[1] “2012-12-11 06:15:31 UTC”#我的时钟显示太平洋(美国)标准时间22:15:31
>date.c0PST date.c0PST
[1] “2012-12-10 22:15:42太平洋标准时间”

“同一日期”?这是否意味着测量了时区中的日期(即打印表示法),或者表示为UCT时间时的相同日期?这意味着日期字符串是相同的,即使如果我们将两个时间戳转换为同一时区,通用日期也会不同。我将编辑我的问题以反映这一点。感谢您的努力。我觉得我问题中的模棱两可破坏了你的努力。我对它投了更高的票,因为它很好地解释了日期和时区的内容。只需利用
tz
参数来
as.date
<代码>截止日期(Date.Syd,tz=“Australia/Sydney”)==截止日期(Date.Ldn,tz=“GMT”)
[1]正确
+1谢谢。你的建议总是有助于我的一般理解。我想对于今天的特殊问题,我必须坚持使用字符串解析方法。
> date.Syd_lt <- as.POSIXlt(date.Syd)
> date.Ldn_lt <- as.POSIXlt(date.Ldn)

> paste0(date.Syd_lt$year + 1900, "-", date.Syd_lt$mon + 1, "-", date.Syd_lt$mday) == 
+ paste0(date.Ldn_lt$year + 1900, "-", date.Ldn_lt$mon + 1, "-", date.Ldn_lt$mday)
[1] TRUE
> Sys.setenv(TZ="Australia/Sydney")
> d <- Sys.Date()
> d
[1] "2012-12-11"

> Sys.setenv(TZ="America/Los_Angeles")
> Sys.Date()
[1] "2012-12-10"
> d
[1] "2012-12-11"
> Sys.setenv(TZ="America/Los_Angeles")
> .POSIXct(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:01:26.667964 PST"
> .POSIXct(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:01:26.668636 EST"

> Sys.setenv(TZ="Australia/Sydney")
> .POSIXct(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:01:26.669352 PST"
> .POSIXct(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:01:26.669907 EST"
> Sys.setenv(TZ="America/Los_Angeles")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.135976 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.137197 EST"

> Sys.setenv(TZ="Australia/Sydney")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.138371 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.13928 EST"
> date.p5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT+5'))
> date.m5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT-5'))
> date.p5
[1] "2012-12-11 01:02:51 GMT"
> date.m5
[1] "2012-12-11 11:03:05 GMT"

> date.m5C <-  as.POSIXct(Sys.time(), tz = 'GMT-5')
> date.m5C
[1] "2012-12-10 22:08:19 PST"
> date.p5C <-  as.POSIXct(Sys.time(), tz = 'GMT+5')
> date.p5C
[1] "2012-12-10 22:08:44 PST"

> date.l0PST <-  as.POSIXlt(Sys.time(), tz = 'PST')
> date.l0PST
[1] "2012-12-11 06:15:31 UTC"  # My clock reads 22:15:31 Pacific (US) Standard Time
> date.c0PST <-  as.POSIXct(Sys.time(), tz = 'PST')
> date.c0PST
[1] "2012-12-10 22:15:42 PST"