为什么 Date.yesterday() 在 Rails 中返回前天?

S.G*_*ami 1 ruby-on-rails

我对 有点困惑Date.yesterday(),例如:

$ rails c
Loading development environment (Rails 6.0.3.2)
irb(main):001:0> Date.today
=> Fri, 10 Jul 2020
irb(main):002:0> Date.yesterday
=> Wed, 08 Jul 2020
irb(main):003:0> Time.now
=> 2020-07-10 03:54:46.02207138 +0530
irb(main):004:0>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但如果我没记错的话,如果今天是星期五,这是真的,前一天应该是星期四,就像我在小学学到的那样。

这里发生了什么?

Sch*_*ern 5

tl;dr:使用Date.currentandTime.current代替Date.todayand Time.now

您的应用程序有自己的时区,Time.zone. Ruby 不知道时区,但 Rails 知道。Rails部分更新TimeDate了解时区,但不是完全更新。Rails 添加的任何方法都可以识别时区。Date.yesterdayDate.tomorrow,例如。内置的 Ruby 方法将其单独保留,例如Date.today. 这引起了一些混乱

Date.today根据您当地的时区,+0530 今天给出。Date.yesterday昨天根据您的应用程序的时区给出,我猜是 +0000 (UTC)。2020-07-10 03:54:46 +0530 是 2020-07-09 22:24:46 UTC 所以Date.yesterday是 2020-07-08。

使用Date.current代替Date.todayDate.yesterday是一个薄包装Date.current.yesterday。同样,使用Time.current代替Time.now

ThoughtBot 文章It's About Time (Zones)详细讨论了 Rails 时区,并提供了简单的注意事项和注意事项以避免时区混淆。

不要使用

  • 现在的时间
  • 日期.今天
  • Date.today.to_time
  • Time.parse("2015-07-04 17:05:37")
  • Time.strptime(string, "%Y-%m-%dT%H:%M:%S%z")

使用

  • 时间.当前
  • 2小时前
  • 时区今天
  • 当前日期
  • 1.day.from_now
  • Time.zone.parse("2015-07-04 17:05:37")
  • Time.strptime(string, "%Y-%m-%dT%H:%M:%S%z").in_time_zone