Debian 在 R 中没有考虑夏令时

Posted

技术标签:

【中文标题】Debian 在 R 中没有考虑夏令时【英文标题】:Debian not taking daylight saving time into account in R 【发布时间】:2017-11-13 14:58:44 【问题描述】:

我使用以下代码来查找中欧是否在使用由变量年、月和日给出的日期中的夏令时。

timeString = paste(toString(year), formatC(month, width = 2, flag="0"), formatC(day, width = 2, flag="0"), "12", sep = "-")
time = strptime(timeString, format = "%Y-%m-%d-%H")
diff = as.numeric(as.POSIXct(time, tz="UTC") - as.POSIXct(time, tz="Europe/Prague"))

在我的 PC (Ubuntu 16.04) 上,当夏令时处于活动状态时,diff 为 2,否则为 1,但在使用 Debian 8.8 的服务器上,在所有情况下它都是 1。你知道如何将服务器设置为 Ubuntu 吗?谢谢。

更新:Debian 时间设置的更改也会更改用于 crontab 的时间,这是不可取的。使用新配置重新安装 R 似乎有风险,因为每隔几分钟就会运行一些 R 脚本。所以我选择了 R 函数形式的“丑陋”解决方案:

DaylightSaving = function(year, month, day) 
      # years 2010-2030
      if (year < 2010 || year > 2030) 
        stop("The function is implemented now only for years 2010-2030")
      
      dayStart = c(28, 27, 25, 31, 30, 29, 27, 26, 25, 31, 29, 28, 27, 26, 
    31, 30, 29, 28, 26, 25, 31)
      dayEnd = c(31, 30, 28, 27, 26, 25, 30, 29, 28, 27, 25, 31, 30, 29, 
    27, 26, 25, 31, 29, 28, 27)
      if (month < 3 || month > 10) 
        return(FALSE)
       else if (month == 3 && day < dayStart[year - 2009]) 
        return(FALSE)
       else if (month == 10 && day >= dayEnd[year - 2009]) 
        return(FALSE)
      
      return(TRUE)
    

【问题讨论】:

您是否花时间检查两个系统是否具有相同的时区设置? 【参考方案1】:

首先,如果你想检查是否正在使用夏令时,你可以简单地这样做:

#Make a test date
atime <- as.POSIXct("2017-05-23 13:25", 
                    tz = "Europe/Prague")
#test for DST
as.POSIXlt(atime)$isdst > 0

POSIXlt 类在内部是一个列表,其中包含一个元素 isdst,如果夏令时未启用,则为 0,当夏令时启用时为正,当该信息不可用时为负。 (见?DateTimeClasses)。

我还想从有关时区的帮助页面中指出以下内容:

请注意,除了被替换的地方,时区的操作是一个操作系统 服务,甚至在更换第三方数据库的情况下使用和 可以更新(参见“时区名称”部分)。不正确 结果永远不会是 R 问题,因此请确保您拥有 礼貌不要怪 R。

问题不在于 R,而是您的 Debian 安装忽略了夏令时。您可以通过使用选项--with-internal-tzcode 配置 R 来解决此问题,因此它使用自己的时区数据库。但如果您的 Debian 时区系统设置正确,这通常是不必要的。有关如何配置 R 的更多信息可以在帮助页面 ?timezones 和 Installation and Administration manual - appendix B 中找到。

解决此问题的最佳方法是确保您的 Debian 安装正确处理夏令时。您可以先检查您是否拥有正确版本的tzdata package。

在 unix.stackexchange.com 上有一个类似的问题:

https://unix.stackexchange.com/questions/274878/system-disregards-daylight-saving-time

【讨论】:

谢谢 Joris,这是 Debian 服务器的系统管理员的工作,他现在有很多工作要做,他承诺会在 9 月份在夏令时更改之前解决它。

以上是关于Debian 在 R 中没有考虑夏令时的主要内容,如果未能解决你的问题,请参考以下文章

生成没有夏令时的时间序列 - r

在指定时区导入日期时间,忽略夏令时

如何在 R 中将山地标准时间 (MST) 转换为山地夏令时间 (MDT)

在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)

存储在 SQL Server DB 中的 DateTime 不考虑夏令时。当我把它拉出来时,我该如何解决这个问题?

Java 8 的 ZoneOffset 是不是考虑了夏令时?