R timeDate包 - 时区不一致

时间:2016-04-30 04:46:38

标签: r datetime timezone

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

  • EST = GMT - 5,而不是夏令时
  • EST =格林尼治标准时间 - 从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位于EST / EDT时区,而USColumbusDayUSVeteransDay位于GMT时区。必须执行以下操作才能均衡:

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是Q&amp; A网站,请允许我将其标记为一个。您是否同意timeDate应该在当地时区存储假期,以及在同一时区存储每个国家的所有假期?

1 个答案:

答案 0 :(得分:1)

我对R的工作并不多,但我会解决你问题的这一部分:

  

您是否同意timeDate应该在当地时区存储假期,以及在同一时区存储每个国家的所有假期?

没有。从根本上说,假期不应属于当地时区,也不属于格林威治标准时间,也不属于任何其他时区。在绝大多数情况下,假期的发生只是一个日历日期,包括年,月和日期。

在具有多个时区(如美国)的国家/地区观察假期时,将时间存储在当地时区是没有意义的。同样地,世界各地许多不同的人都会看到圣诞节或新年这样的假期是没有意义的。

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

请记住,并非所有当地时间都在午夜开始。某些时区的夏令时转换不包括午夜时段,从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)

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