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 中将山地标准时间 (MST) 转换为山地夏令时间 (MDT)
在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)