【发布时间】:2015-11-23 13:24:49
【问题描述】:
我正在开发一个 Rails 应用程序,我需要在给定特定偏移量或时区的情况下找到夏令时的开始和结束日期。
我基本上将从用户浏览器接收到的时区偏移量("+3","-5")保存在我的数据库中,并且我想在它因夏令时而更改时对其进行修改。
我知道Time 实例变量具有dst? 和isdst 方法,如果存储在其中的日期是否处于夏令时,它们会返回真或假。
> Time.new.isdst
=> true
但是使用它来查找夏令时的开始和结束日期会占用太多资源,而且我还必须为我拥有的每个时区偏移量这样做。
我想知道一个更好的方法。
【问题讨论】:
-
所以回顾你正在做的事情会想到一个问题。您只存储它们的偏移量。但是是您的时间还是UTC的偏移量?如果偏移量是 UTC,则 DST 不会起作用,除非它们恰好位于遵守 DST 的区域中。还是偏移量与您的不同,再次,您会知道他们是否在观察 DST 吗?如果您的当地时间因为 DST 而发生变化,而他们的时间也发生变化,则偏移量保持不变。
-
我发现您执行此操作的方式可能存在一些问题。仅仅因为一个人的偏移量使他们处于美国西部时区,并不能告诉您他们是否遵守 DST。亚利桑那州的大部分地区不遵守 DST。请注意,我说的是大多数,而不是全部。这就是您可能希望将实际时区存储为字符串的原因。
-
让我给你更多的细节。我正在研究一个太阳能计算器,它计算地球上给定位置每天的太阳仰角。该应用程序只获取一次地理位置坐标、日期和时区偏移量。在服务器上,我运行一个 cron 作业,每天午夜重新计算每个时区的海拔高度(我可以拥有来自纽约、伦敦、莫斯科等地的用户)。
-
显然我需要为每个时区执行此操作,所以基本上我的 cron 作业实际上每 15 分钟运行一次,找到时间变为 00:00 AM 的时区并重新计算所有内容。现在我使用从用户浏览器收到的偏移量存储我的时区(目前我将获得欧洲和美国大部分地区的夏季偏移量)。但是到了秋天,这会发生变化(并且变化的日期因地区而异)。这就是我需要找到 DST 期间的原因。
-
回到您的问题,是的,我目前只存储从
.getTimezoneOffset()获得的偏移量。我知道美国的某些州和世界上大多数国家都没有 DST。但是我认为我可以使用我已经拥有的地理位置坐标来解决这个问题。我可以使用它们获取用户的国家/地区并进行适当的查询。
标签: ruby-on-rails ruby timezone dst timezone-offset