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

Posted

技术标签:

【中文标题】在指定时区导入日期时间,忽略夏令时【英文标题】:Import date-time at a specified timezone, disregard Daylight Savings Time 【发布时间】:2011-12-21 16:31:03 【问题描述】:

我从数据记录器中获得时间序列数据,该数据记录器设置为一个没有夏令时的时区(NZST 或 UTC+12:00),数据跨越数年。数据记录器不考虑 DST 更改,并在有/没有 DST 的情况下与本地时间同步(取决于部署它的人)。

但是,当我将数据输入 R 时,我无法正确使用 as.POSIXct 来忽略 DST。我在具有以下设置的 Windows 计算机上使用 R 2.14.0:

> Sys.timezone()
[1] "NZDT"
> Sys.getlocale("LC_TIME")
[1] "English_New Zealand.1252"

以下是春季 DST 更改的三个时间戳,每个时间戳相隔 1 小时:

> ts_str <- c("28/09/2008 01:00", "28/09/2008 02:00", "28/09/2008 03:00")
> as.POSIXct(ts_str, format="%d/%m/%Y %H:%M", tz="")
[1] "2008-09-28 01:00:00 NZST" NA
[3] "2008-09-28 03:00:00 NZDT"
> as.POSIXct(ts_str, format="%d/%m/%Y %H:%M", tz="UTC")
[1] "2008-09-28 01:00:00 UTC" "2008-09-28 02:00:00 UTC"
[3] "2008-09-28 03:00:00 UTC"

如您所见,时钟从 1:59 跳到 3:00,因此 2:00 无效,因此不适用。此外,我可以使用 tz="UTC" 让它忽略 DST 更改。但是,我宁愿保留正确的时区,因为我有其他数据系列记录 DST(NZDT 或UTC+13:00),我想融入(通过merge)供我分析。

如何在 MS Windows 计算机上配置 tz 参数?我尝试了很多东西,例如“NZST”、“新西兰标准时间”、“UTC+12:00”、“+1200”等,但没有运气。还是我要修改一些其他设置?

【问题讨论】:

【参考方案1】:

你可以使用tz="Etc/GMT+12":

as.POSIXct(ts_str, format="%d/%m/%Y %H:%M", tz="Etc/GMT+12")
[1] "2008-09-28 01:00:00 GMT+12" "2008-09-28 02:00:00 GMT+12"
[3] "2008-09-28 03:00:00 GMT+12"

有关可用时区的完整列表,

dir(file.path(R.home("share"),"zoneinfo"), recursive=TRUE)

其中有几个 .tab 文件不是时区但包含一些信息,但我的 regex-fu 不够好,无法使用 dir 的模式参数排除它们。

【讨论】:

【参考方案2】:

如果只是将 12*60*60 添加到该 UTC 派生向量,您将拥有本地“标准”时间。

【讨论】:

12 小时?你的意思是1小时?即 60*60 你想要 UTC+12 不是吗? @Mike Toews。我以为你比 UTC 早 12 小时 啊,我明白了,是的,现在说得通了

以上是关于在指定时区导入日期时间,忽略夏令时的主要内容,如果未能解决你的问题,请参考以下文章

UTC 时间、时区、夏令时和夏令时切换日期

Calendar日期类详解SimpleDateFormat时区Date夏令时常用方法,日期差获取当前时间

如何使用时区信息在 MySQL 中存储日期时间

将日期字符串解析为某个时区(支持夏令时)

针对当前时区调整的不同夏令时的UTC日期[重复]

澳大利亚/墨尔本时区的 Java 8 中的日期时间夏令时问题