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