是Date.today在UTC?

时间:2012-04-18 23:39:39

标签: ruby date timezone

在Ruby中调用Date.today会返回当前日期。但是,它的时区是什么?我假设UTC,但我想确定。 documentation没有说明任何一种方式。

5 个答案:

答案 0 :(得分:48)

您可以使用

逃脱

Time.now.utc.to_date

in ruby​​

答案 1 :(得分:35)

TL; DR: Date.today使用系统的本地时区。如果您需要它是UTC,而是从UTC时间获取日期,例如Time.now.utc.to_date


日期没有时区,因为它们不代表时间。

那就是说,至于如何它计算当天,我们来看看the code for Date.today中的这个摘录:

time_t t;
struct tm tm;
// ...
if (time(&t) == -1)
  rb_sys_fail("time");
if (!localtime_r(&t, &tm))
  rb_sys_fail("localtime");

然后继续使用use tm来创建Date对象。由于tm包含系统使用localtime()的本地时间,因此Date.today使用系统的本地时间,而不是UTC。


您可以随时在任何Time上使用Time#utc将其就地转换为UTC,或Time#getutc以UTC格式返回新的等效Time对象。然后,您可以在其上调用Time#to_date以获得Date。所以:some_time.getutc.to_date

如果你正在使用ActiveSupport’s time zone support(包含在Rails中),请注意它与Ruby的时间构造函数完全分开,并且不会影响它们(即它不会改变Time.now或{{1工作)。另请参阅ActiveSupport extensions to Time

答案 2 :(得分:11)

日期的实例表示为天文朱利安日数;它没有一天的分数部分。虽然朱利安日与格林威治标准时间相关 - 所以从技术上讲,日期的实例应该被认为是格林尼治标准时间 - 对于大多数目的,你可以忽略它并将其视为没有时区。如果您将时区转换为DateTime或Time,则只关心时区。

ActiveSupport的日期转换工具可让您指定是想要本地时间还是UTC。

E.g:

>> t = Date.today.to_time
=> Wed Apr 18 00:00:00 -0400 2012
>> t.zone
=> "EDT"
>> t = Date.today.to_time(:utc)
=> Wed Apr 18 00:00:00 UTC 2012
>> t.zone
=> "UTC"

答案 3 :(得分:2)

您可以使用

Date.current

要在配置的时区获取当前日期。

答案 4 :(得分:1)

如果您的rails应用程序配置为以时区UTC运行,那么只需使用Time.zone.today,否则使用Time.now.utc.to_date

强制它