在 Ruby 中调用Date.today
会返回当前日期。但是,它在哪个时区?我假设UTC,但我想确定。该文档没有说明任何一种方式。
6 回答
你可以通过使用逃脱
Time.now.utc.to_date
在红宝石中
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");
然后它继续使用 usetm
来创建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
.
Date 的实例表示为天文儒略日数;它没有一天的小数部分。虽然儒略日是相对于格林威治标准时间的——所以从技术上讲,一个日期的实例应该被认为是格林威治标准时间——在大多数情况下,你可以忽略它并将其视为没有时区。如果您将其转换为日期时间或时间,您只会关心时区。
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"
您可以使用
Date.current
获取配置时区的当前日期。
如果您的 Rails 应用程序配置为在 UTC 时区运行,则只需使用Time.zone.today
,否则通过使用强制它Time.now.utc.to_date
红宝石
# Using local timezone
Date.today
Ruby on Rails
# Using UTC
Date.yesterday
Date.current
Date.tomorrow
这特别令人讨厌,因为当使用 egDate.today
和Date.yesterday
结合使用时,它可能会根据时区和当前时间产生非常意想不到的结果。
例如,欧洲中部时间 (UTC+1) 时区的 00:30Date.yesterday
将比Date.today
. 在其他情况下,Date.today
和Date.yesterday
可以具有相同的值。