45

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

4

6 回答 6

57

你可以通过使用逃脱

Time.now.utc.to_date

在红宝石中

于 2013-06-01T06:40:59.137 回答
50

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.nowDate.today工作方式)。另请参阅ActiveSupport 对Time.

于 2012-04-19T00:06:48.610 回答
11

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"
于 2012-04-19T00:07:25.527 回答
3

您可以使用

Date.current

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

于 2017-10-14T04:55:31.890 回答
2

如果您的 Rails 应用程序配置为在 UTC 时区运行,则只需使用Time.zone.today,否则通过使用强制它Time.now.utc.to_date

于 2016-08-24T14:09:16.263 回答
1

红宝石

# Using local timezone
Date.today

Ruby on Rails

# Using UTC
Date.yesterday
Date.current
Date.tomorrow

这特别令人讨厌,因为当使用 egDate.todayDate.yesterday结合使用时,它可能会根据时区和当前时间产生非常意想不到的结果。

例如,欧洲中部时间 (UTC+1) 时区的 00:30Date.yesterday将比Date.today. 在其他情况下,Date.todayDate.yesterday可以具有相同的值。

于 2021-12-22T00:15:37.213 回答