R
中的此命令format(as.POSIXct(15*60,origin="2016-05-31 00:00:00",ts="UTC"),"%Y-%m-%d %H:%M")
给了我这个
"2016-05-30 20:15"
奇怪的是:
format(as.POSIXct(15*60,origin="2016-05-31 00:00:00",ts="UTC","%Y-%m-%d %H:%M"))
给了我预期的结果:
"2016-05-31 00:15:00"
和警告消息,因为未正确放置最后一个括号。
为什么我的第一个命令没有给我预期的结果(即" 2016-05-31 00:15")?
答案 0 :(得分:1)
您不小心使用ts
代替tz
作为时区参数。通常情况下,它不会有更多,但时区有一些微妙的可能是痛苦的(特别是如果,像我一样,你只是间歇性地使用日期时间数据,并不得不,不时刷新你的R日期时间知识),也许这值得多一点解释。
检查以下每个示例中的时区。我们只会查看as.POSIXct
函数,因为这就是问题所在:
您的第一个示例解析为默认时区(您的本地时区),因为忽略了ts
参数。因此,时间会转换为您所在时区的"2016-05-30 20:15"
当地时间(看起来像美国东部夏令时):
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC"), "tzone")
[1] ""
接下来的三个版本给出“预期”时间("2016-05-31 00:15:00"
),因为在每种情况下时区都设置为UTC:
与上一个示例相同,但tz
参数将时区设置为UTC:
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC"), "tzone")
[1] "UTC"
在第二个示例中,ts
参数再次被忽略。但是,格式字符串被解释为tz
参数,因为它是未命名的,tz
是as.POSIXct
参数顺序中的下一个(有效)参数。但是,由于它作为tz
参数无效,因此将其解释为GMT
(如as.POSIXct
的帮助文件中所述):
要用于转换的时区规范(如果需要)。系统特定(参见时区),但“”是当前时区,“GMT”是UTC(世界时,协调)。在某些带有警告的平台上,无效值通常被视为UTC。
换句话说,这次时区被意外设置为UTC。
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC","%Y-%m-%d %H:%M"), "tzone")
[1] "%Y-%m-%d %H:%M"
但请注意,如果我们将参数命名为format
语句,则时区将重新解析为您的本地时区而不是GMT(导致时间值再次转换为您的本地时间):< / p>
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC", format="%Y-%m-%d %H:%M"), "tzone")
[1] ""
与之前相同,只是我们将ts
更改为tz
:
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC","%Y-%m-%d %H:%M"), "tzone")
[1] "UTC"