Ruby Time#dst如何?

jbk*_*jbk 6 ruby time standard-library

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

据推测,这必须通过日期和时区的组合来辨别,但那时没有意义,因为时区的低纬度不使用夏令时?因此,它肯定需要位置才能辨别#dst??

我错过了什么?

Sch*_*ern 3

为了处理时区和夏令时,Ruby 与其他所有事物一样,调用localtime_rC函数。这会将时间放入名为 的 C 结构中tm,其中包含一个名为 的字段isdst。鲁比正在读那面旗帜。

localtime_risdst首先通过从全局变量获取您的时区来计算tznametzname是通过调用确定的tzset。它的工作如何tzset依赖于系统。它可以来自 TZ 环境变量、读取文件或查询操作系统服务。

例如。

# 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
Run Code Online (Sandbox Code Playgroud)

一旦有了时区,localtime_r就可以使用“tz 数据库”又名“tzdata”又名“zoneinfo”又名“Olson 数据库”(以其创建者 Arthur 命名)从GMT转换为所需时区(使用该日期应用的规则)大卫·奥尔森. 以前是私人项目,现在由IANA维护。它是一组安装在您的系统上或随 Ruby 一起提供的文件,其中包含的内容远远超出您想了解的有关时区和夏令时的一切

tz 数据库将夏令时(以及其他奇怪的事情,例如战争与和平时间)视为另一个时区。时区记录一直追溯到我们有时区的那一天。在我们有时区之前,该位置使用的是太阳正午。由于这些历史复杂性和时区变化,tz 数据库更喜欢与城市(例如“美国/纽约”)合作并为您确定时区。

区数据文件包含广泛的评论和背景,如果您对日历的历史感兴趣,那么它们是一本令人着迷的读物。