【发布时间】:2015-12-17 13:03:48
【问题描述】:
也许是一个愚蠢的问题,表明我对夏令时基础知识缺乏了解,但根据标题,Time.dst? 如何知道时间对象是真的还是假的?
大概这必须通过日期和时区的组合来辨别,但这没有意义,因为时区中的低纬度不使用夏令时?因此,它肯定需要位置来识别#dst吗? ?
我错过了什么?
【问题讨论】:
标签: ruby time standard-library
也许是一个愚蠢的问题,表明我对夏令时基础知识缺乏了解,但根据标题,Time.dst? 如何知道时间对象是真的还是假的?
大概这必须通过日期和时区的组合来辨别,但这没有意义,因为时区中的低纬度不使用夏令时?因此,它肯定需要位置来识别#dst吗? ?
我错过了什么?
【问题讨论】:
标签: ruby time standard-library
为了处理时区和夏令时,Ruby 和其他所有东西一样,是callinglocaltime_r C function。这将时间放在一个名为tm 的C 结构中,其中包括一个名为isdst 的字段。 Ruby 正在读取该标志。
localtime_r 首先通过从全局 tzname 变量中获取您的时区来计算 isdst。 tzname 由调用 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 包含广泛的评论和背景,如果您对日历的历史感兴趣,它们是一本引人入胜的读物。
【讨论】:
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_isdst 和isdst 以了解其计算方式。
【讨论】: