【问题标题】:R timeDate package - inconsistent time zones [closed]R timeDate 包 - 时区不一致[关闭]
【发布时间】:2016-04-30 04:46:37
【问题描述】:

timeDate 在 GMT 时区存储一些美国假期。由于夏令时,格林威治标准时间和美国时区之间的差异全年不同,因此美国假期不应存储在格林威治标准时间时区中。

  • EST = GMT - 5 而不是夏令时
  • EST = GMT - 4 从 3 月的第 2 个星期日到 11 月的第 1 个星期日。 (又名 EDT)

这可能会带来一些问题。例如:

library(timeDate)
holidayEIA <- function(x){ c(holidayNYSE(x), 
                             USColumbusDay(x)@Data, 
                             USVeteransDay(x)@Data)}
HolidaysEIA <- holidayEIA (2015)

#Output:
NewYork
[1] [2015-01-01 00:00:00] [2015-01-19 00:00:00] [2015-02-16 00:00:00]
[4] [2015-04-03 00:00:00] [2015-05-25 00:00:00] [2015-07-03 00:00:00]
[7] [2015-09-07 00:00:00] [2015-11-26 00:00:00] [2015-12-25 00:00:00]
[10] [2015-10-11 20:00:00] [2015-11-10 19:00:00]

这里holidayNYSE 是美国东部时间/美国东部时间时区,而USColumbusDayUSVeteransDay 是格林威治标准时间。必须执行以下操作才能均衡:

library(timeDate)
holidayEIA <- function(x){ c(holidayNYSE(x), 
                             USColumbusDay(x)@Data+ 14400, 
                             USVeteransDay(x)@Data+ 18000)}
HolidaysEIA <- holidayEIA (2015)

#Output
NewYork
[1] [2015-01-01] [2015-01-19] [2015-02-16] [2015-04-03] [2015-05-25]
[6] [2015-07-03] [2015-09-07] [2015-11-26] [2015-12-25] [2015-10-12]
[11] [2015-11-11]

这不是一个真正的问题,但鉴于 SO 是一个问答网站,请允许我将其表述为一个。你不同意timeDate 应该在本地时区存储假期,以及在同一时区下存储每个国家/地区的所有假期吗?

【问题讨论】:

  • 要求我们同意一个非推荐的包应该有不同的设计是太离题了。
  • OK 将把它取下来。网站的新手。在删除之前,你为什么说不推荐?
  • 推荐的软件包是随 R 一起提供的。stackoverflow.com/questions/9700799/… 其他软件包是其作者和维护者的责任(具有广泛不同的功能)。他们是负责设计决策的人,而不是我们。我从来没有见过那个包在使用中,所以我认为它在 R 包的“边缘”上相当远。但这只是一个老家伙的观点,这不是 SO 维护者想要看到的。
  • 谢谢。我发现马特约翰逊的回答很有趣。即使不在主题范围内,也要保持这一点。

标签: r datetime timezone


【解决方案1】:

我不经常使用 R,但我会​​解决你的这部分问题:

您不同意 timeDate 应该在本地时区存储假期,以及在同一时区下存储每个国家/地区的所有假期吗?

没有。从根本上说,假期不应该属于本地时区,也不属于 GMT,也不属于任何其他时区。在绝大多数情况下,假期的发生只是一个日历日期,由年、月和日期组成。

如果在具有多个时区的国家/地区(例如美国)庆祝假期,则将其与本地时区的时间一起存储是没有意义的。同样,对于像圣诞节或元旦这样世界各地许多不同的人都会庆祝的节日来说,这也没有任何意义。

然而,当一个特定的人观察假期时,你可以取那个人的当前时区,将其应用于日历日期,并计算时间一天的开始,以及第二天的开始。这些值一起形成了一个半开区间[start, end),描述了当地“日”如何映射到世界时。

请注意,并非所有当地日子都从午夜开始。某些时区的 DST 转换不包括午夜时间,从 23:59:59 到 01:00:00 有一个春天。

考虑以下示例:

  • 2017 年 10 月 15 日是巴西的“教师节”假期 (per this list)。
  • 也恰好是春季过渡的预定日期 (as shown here)。
  • 存储在数据中,应该只是一个日期:2017-10-15
  • 当被特定人观察时,您会考虑他们的时区。
  • 巴西有多个时区,标准时间偏移范围从 UTC-2 到 UTC-5 (see Wikipedia for details)。此外,他们中的一些人遵守 DST,而另一些人则没有。
  • 所以 2017 年圣保罗的教师节是 [2017-10-15T01:00-02:00, 2017-10-16T00:00-02:00),而马瑙斯的同一个假期是 [2017-10-15T00:00-04:00, 2017-10-16T00:00-04:00)
  • 标准化为 UTC,在圣保罗是 [2017-10-15T03:00Z, 2017-10-16T02:00Z),但在马瑙斯是 [2017-10-15T04:00Z, 2017-10-16T04:00Z)

从这里我们可以看出,“一天”的概念对于每个人来说都是不一样的,无论是绝对的开始和结束,还是持续时间。

【讨论】:

  • 非常好的点。说得通。为了一致性和简单性,为什么不将所有美国联邦假期存储在同一时区?遇到这种情况给我带来了一个问题,我花了几个小时来发现和解决。将其乘以多年来可能遇到同样情况的数百或数千人。
  • 假期与日期相关联,而不是时间。
  • 即使很难,我也同意“假期与日期相关联,而不是时间”,timeDate 包关联假期时间日期时间戳,从全球角度来看,这样做是有道理的。考虑仅在一个时区观察到的当地节假日。如果使用日内数据,没有本地时间戳将是一个问题。马特的回答让我改变了我的观点。
  • 我想你可能错过了我的意思。假期本身确实只与日期相关,与时区的任何时间无关。只有在特定地点观察到它时,您才能对其应用时间范围,并且该地点必须限制在单个时区。如果您的图书馆将其附加到午夜 UTC,您应该忽略这部分数据。只需从中获取年、月和日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2023-03-24
  • 2023-03-02
相关资源
最近更新 更多