小智 48
你可以通过使用逃脱
Time.now.utc.to_date
在红宝石
And*_*all 38
TL; DR: Date.today使用系统的本地时区.如果您需要它是UTC,而是从UTC时间获取日期,例如Time.now.utc.to_date.
日期没有时区,因为它们不代表时间.
也就是说,至于它如何计算当天,让我们从代码中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");
Run Code Online (Sandbox Code Playgroud)
然后它继续使用use tm来创建Date对象.由于tm包含系统的本地时间使用localtime(),Date.today因此使用系统的本地时间,而不是UTC.
您可以随时使用Time#utc任何Time就地转换为UTC,或Time#getutc返回UTC中的新等效Time对象.然后你可以打电话Time#to_date来获得一个Date.所以:some_time.getutc.to_date.
如果您使用的ActiveSupport的时区支持(包括使用Rails),请注意,这是从Ruby的时间构造完全独立,不会影响他们(即它并不会改变Time.now或Date.today工作).另请参阅ActiveSupport扩展Time.
Ric*_*ond 12
Date的实例表示为天文朱利安日数; 它没有一天的分数部分.虽然朱利安日与格林威治标准时间相关 - 所以从技术上讲,日期的实例应该被视为格林威治标准时间 - 对于大多数用途,您可以忽略它并将其视为没有时区.如果将时区转换为DateTime或Time,则只关心时区.
ActiveSupport的日期转换工具允许您指定是要本地时间还是UTC.
例如:
>> 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"
Run Code Online (Sandbox Code Playgroud)