是Date.today在UTC?

Mat*_*ins 33 ruby timezone date

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

小智 48

你可以通过使用逃脱

Time.now.utc.to_date

在红宝石

  • 比接受的答案要好得多.我想知道这是自2012年4月以来添加的. (3认同)
  • 这是有用的信息,但它没有回答这个问题.这回答了相关问题"我怎样才能得到当前UTC时间的日期?",海报询问Date.today是否在UTC中,而不是如何在utc中获取日期. (3认同)

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.nowDate.today工作).另请参阅ActiveSupport扩展Time.

  • 是的,使用ActiveSupport的时区管理,您可以执行`Time.zone.now.to_date`,它等于`Time.current.to_date`,等于`Date.current`. (5认同)

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)

  • 正如安德鲁所说, Date.today 确实从本地时间而不是 UTC 生成日期。要获取与 UTC 时间相对应的日期,请尝试 Time.now.utc.to_date (2认同)