【问题标题】:How does Ruby Time#dst?Ruby Time#dst 怎么样?
【发布时间】:2015-12-17 13:03:48
【问题描述】:

也许是一个愚蠢的问题,表明我对夏令时基础知识缺乏了解,但根据标题,Time.dst? 如何知道时间对象是真的还是假的?

大概这必须通过日期和时区的组合来辨别,但这没有意义,因为时区中的低纬度不使用夏令时?因此,它肯定需要位置来识别#dst吗? ?

我错过了什么?

【问题讨论】:

    标签: ruby time standard-library


    【解决方案1】:

    为了处理时区和夏令时,Ruby 和其他所有东西一样,是callinglocaltime_r C function。这将时间放在一个名为tm 的C 结构中,其中包括一个名为isdst 的字段。 Ruby 正在读取该标志。

    localtime_r 首先通过从全局 tzname 变量中获取您的时区来计算 isdsttzname 由调用 tzset 确定。 tzset 的工作方式取决于系统。它可以来自 TZ 环境变量、读取文件或查询 OS 服务。

    例如。

    # Time zone from the system.
    $ ruby -e 'puts Time.now.zone; puts Time.now.dst?'
    PDT
    true
    
    # Time zone from the TZ environment variable.
    $ TZ='Australia/Brisbane' ruby -e 'puts Time.now.zone; puts Time.now.dst?'
    AEST
    false
    

    一旦有了时区,localtime_r 就可以使用 "tz database" aka "tzdata" aka "zoneinfo" aka "the Olson 数据库”以其创建者 Arthur David Olson 命名。以前是私人努力,现在由IANA 维护。它是安装在您的系统上或随 Ruby 一起提供的一组文件,其中包含 Far More Than Everything You Ever Want To Know About Time Zones and Daylight Savings

    tz 数据库treats daylight savings (and other weird things like War and Peace time) as just another time zone。时区记录一直追溯到我们有时区的时候。在我们使用该位置的时区solar noon 之前。由于这些历史复杂性和时区变化,tz 数据库更喜欢work with cities (such as "America/New York") 并为您确定时区。

    time zone data files 包含广泛的评论和背景,如果您对日历的历史感兴趣,它们是一本引人入胜的读物。

    【讨论】:

    • 嗯,干得好@Schwern,非常彻底的答案。在我们说话时查找奥尔森数据库,同时高兴地揉着我的大腿,为您和您的回答提供的这种新的时间知识字体! :)
    【解决方案2】:

    Ruby 2.2.0 Time.dst? method 指的是time.c 中的time_isdst(...) function

    // ...
    return tobj->vtm.isdst ? Qtrue : Qfalse
    

    经过大量修改后,这似乎对应于UNIX struct tm tm_isdt member

    int    tm_isdst daylight savings flag
    

    time.c 中搜索tm_isdstisdst 以了解其计算方式。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 2013-09-29
      • 2012-09-12
      • 2012-11-01
      • 1970-01-01
      • 2011-12-22
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多