深入挖掘R包:lubridate中的时区

4

我开始尝试使用R中的lubridate包。我注意到now(tzone="EST")计算结果如下:

[1] "2015-08-25 13:01:08 EST"

当使用now(tzone="PST")时,会出现警告:

[1] "2015-08-25 18:02:16 GMT"
Warning message:
In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'PST'

那么什么是已知的时区? Lubridate中的有效时区有一个答案。但我想看看自己如何回答这个问题(通过查找包本身)。我查看了now()函数:

> now
function (tzone = "") 
with_tz(Sys.time(), tzone)
<environment: namespace:lubridate>

那么,我看了一下with_tz函数:

> with_tz
function (time, tzone = "") 
{
    check_tz(tzone)
    if (is.POSIXlt(time)) 
        new <- as.POSIXct(time)
    else new <- time
    attr(new, "tzone") <- tzone
    reclass_date(new, time)
}
<environment: namespace:lubridate>
> 

那么我就检查一下check_tz函数:

> check_tz
Error: object 'check_tz' not found

没有找到。我在本地的lubridate R库文件中查找check_tz,但是没有找到任何东西。我进行了谷歌搜索,并找到了这个GitHub页面。它就在那里!看起来olson_time_zones()列出了已知的时区。(更新:olson_time_zones()只返回一部分可用的时区。有关更多详细信息,请参见下面我的评论。)特别地,

> now(tzone="America/Los_Angeles")
[1] "2015-08-25 11:11:14 PDT"

问:如果GitHub上没有一个好的文件或StackOverflow上没有答案,我该如何回答关于已知时区列表的问题?换句话说,我能通过挖掘本地的lubridate库文件来找到答案吗?

问:是否有一个更通用的原则来挖掘R包值得指出?


我也想知道如何在R中一般地找到这种信息。特别是,在这里,有一个关于你问题的具体线索。https://dev59.com/iF0a5IYBdhLWcg3w88g0 - Shawn Mehan
我认为这可能是因为现在(八月末)总是太平洋夏令时(PDT),而在这个时候,太平洋标准时间(PST)不存在。只是一个想法,不知道是否正确。 - Rich Scriven
@RichardScriven,我认为“EST”能够工作的更奇怪,因为stringr :: str_subset(olson_time_zones(),“EST”)什么也没有返回。看起来lubridate也使用OlsonNames()作为tzonestr_subset(OlsonNames(),“EST”)返回“EST”和“EST5EDT”。str_subset(OlsonNames(),“PDT”)返回“PST8PDT”。 - lowndrul
这里有一个小提示,截至lubridate 1.6(2016年9月),不再使用olson_time_zones - 'hereolson_time_zones已被弃用,推荐使用new和基本的OlsonNames' - thelatemail
1个回答

9

您可以通过以下方式找到 lubridate 支持的时区列表:

lubridate::olson_time_zones()

通过输入关键字,这些信息很容易找到。

??timezones

在控制台中。在我的情况下,描述此函数的链接是帮助页面列表中的第二个条目:

输入图像描述

另一个可能性是搜索lubridate手册,查找“可用时区”。


在这种情况下,“??”肯定能找到正确的答案。 - lowndrul
我太快地认为这个可行了。请参见我对@RichardScriven的评论。像“EST”和“PST8PDT”这样的时区可以在now()函数中使用,但不会被olson_time_zones()返回。因此,olson_time_zones()似乎只返回可用时区的子集。 - lowndrul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接