到UTC转换的本地时区:DST更改在错误的时间发生

时间:2014-10-17 09:30:53

标签: r

我将当地时间(欧洲/巴黎)的2013年时间服务转换为UTC。 我使用以下代码

oasi <- read.csv("oasi.csv", sep=";", skip=28, header=FALSE)
oasi$datetime <- as.POSIXct(oasi[,1], tz="Europe/Paris", format="%d.%m.%Y %H:%M:%S")
oasi$utc <- oasi$datetime
attr(oasi$utc, "tzone") <- "UTC"

当我在02/10/2013 02:00打印DST更改时,我看到以下奇怪的行为

                 datetime                 utc
43063 2013-10-27 02:05:00 2013-10-27 00:05:00
43064 2013-10-27 02:15:00 2013-10-27 00:15:00
43065 2013-10-27 02:25:00 2013-10-27 00:25:00
43066 2013-10-27 02:35:00 2013-10-27 00:35:00
43067 2013-10-27 02:45:00 2013-10-27 01:45:00
43068 2013-10-27 02:55:00 2013-10-27 01:55:00
43069 2013-10-27 02:05:00 2013-10-27 00:05:00
43070 2013-10-27 02:15:00 2013-10-27 00:15:00
43071 2013-10-27 02:25:00 2013-10-27 00:25:00
43072 2013-10-27 02:35:00 2013-10-27 00:35:00
43073 2013-10-27 02:45:00 2013-10-27 01:45:00
43074 2013-10-27 02:55:00 2013-10-27 01:55:00
43075 2013-10-27 03:05:00 2013-10-27 02:05:00
43076 2013-10-27 03:15:00 2013-10-27 02:15:00
43077 2013-10-27 03:25:00 2013-10-27 02:25:00
43078 2013-10-27 03:35:00 2013-10-27 02:35:00
43079 2013-10-27 03:45:00 2013-10-27 02:45:00
43080 2013-10-27 03:55:00 2013-10-27 02:55:00

似乎DST在02:35和02:45之间应用,而不是在03:00。 这很奇怪,我不明白为什么会这样。

本地日期时间的输出输出为02:35和02:45:

structure(c(1382834100, 1382838300), class = c("POSIXct", "POSIXt"), tzone = "Europe/Paris")

可能是操作系统错误吗?我使用的是Win7 64位。

2 个答案:

答案 0 :(得分:2)

我可以这样重现:

as.POSIXct(c("27.10.2013 02:35:00", "27.10.2013 02:45:00"), tz="Europe/Paris", format="%d.%m.%Y %H:%M:%S")
#[1] "2013-10-27 02:35:00 CEST" "2013-10-27 02:45:00 CET"

您应该知道您的输入是不明确的。时钟被换了一个小时,所以这个小时存在两次。我不知道在这种情况下如何选择时区。这似乎有点武断。

您需要将时区信息添加到输入中:

as.POSIXct(c("27.10.2013 02:35:00 +0100", "27.10.2013 02:45:00 +0100"), tz="Europe/Paris", format="%d.%m.%Y %H:%M:%S %z")
#[1] "2013-10-27 02:35:00 CET" "2013-10-27 02:45:00 CET"
as.POSIXct(c("27.10.2013 02:35:00 +0200", "27.10.2013 02:45:00 +0200"), tz="Europe/Paris", format="%d.%m.%Y %H:%M:%S %z")
#[1] "2013-10-27 02:35:00 CEST" "2013-10-27 02:45:00 CEST" 

答案 1 :(得分:0)

根据@roland的建议,我试图找到DST更改,添加时区信息并消除初始CET数据集的歧义。这段代码似乎适用于一年的数据集。

oasi <- read.csv("oasi.csv", sep=";", skip=28, header=FALSE, stringsAsFactors=FALSE)
dst.index <- which(abs(difftime(as.POSIXct(oasi[,1], tz="UTC", format="%d.%m.%Y %H:%M:%S"),
                      as.POSIXct(c(oasi[1,1], head(oasi[,1],-1)), tz="UTC", format="%d.%m.%Y %H:%M:%S"),
                      units = "mins")) > 10)

oasi[1:dst.index[1],1] <- paste(oasi[1:dst.index[1],1], "+0100")
oasi[dst.index[1]:dst.index[2],1] <- paste(oasi[dst.index[1]:dst.index[2],1], "+0200")
oasi[-1:-dst.index[2],1] <- paste(oasi[-1:-dst.index[2],1], "+0100")

oasi$datetime <- as.POSIXct(oasi[,1], tz="Europe/Paris", usetz=true, format="%d.%m.%Y %H:%M:%S %z")