首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >鲁比Time#dst是怎么做到的?

鲁比Time#dst是怎么做到的?
EN

Stack Overflow用户
提问于 2015-09-20 22:20:30
回答 2查看 838关注 0票数 7

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

从日期和时区的组合可以看出这一点,但这样做没有意义,因为时区的低纬度地区不使用日光节约?因此,它肯定需要位置来识别#dst?

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-20 23:32:31

为了处理时区和夏令时,Ruby和其他所有东西一样,是呼叫 C函数。这将时间放在一个名为tm的C结构中,其中包括一个名为isdst的字段。鲁比正在读那个旗子。

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

例如。

代码语言:javascript
复制
# 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数据库“ ( "tzdata“aka "zoneinfo”又名“Olson数据库”)将其从格林尼治标准时间转换到所需的时区(使用在该日期应用的规则)。以前是私人工作,现在由IANA维护。它是安装在系统上的一组文件,或者是随Ruby附带的一组文件,其中包含远远超过你想知道的关于时区和日光储蓄的一切

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

时区数据文件包含了大量的评论和背景,如果你对日历的历史感兴趣的话,它们是一个引人入胜的读物。

票数 3
EN

Stack Overflow用户

发布于 2015-09-20 22:40:04

Ruby2.2.0 方法指的是time.c中的函数

代码语言:javascript
复制
// ...
return tobj->vtm.isdst ? Qtrue : Qfalse

这似乎与成员相对应,在经历了大量的破坏之后:

代码语言:javascript
复制
int    tm_isdst daylight savings flag

tm_isdstisdst中搜索time.c以了解如何计算它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32684906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档