红宝石 .past?日期方法在具有 UTC 时区的印度 AWS 服务器的 IST 时区中给出错误结果

Ruby .past? method on date is giving wrong result in IST timezone for AWS server in India with UTC timezone

提问人:Akash Kinwad 提问时间:2/20/2023 更新时间:2/21/2023 访问量:55

问:

我使用该方法来检查日期是否已过日期。 我使用 AWS EC2 服务器,然后在印度区域。.past?

对于凌晨 12 点到凌晨 5.30 点之间的印度时间,如果我们将 IST 时区时间转换为 UTC 并调用该方法,它将返回 true。.past?

time = "2023-02-07 02:24:59 +0530"

DateTime.parse(time).utc.to_date.past?

#It is returning true whereas it should return false

服务器时区为 UTC

知道这里出了什么问题吗?

Ruby-on-Rails Ruby 日期时间 时区

评论

0赞 KunalK 2/20/2023
这可能是因为您在将其转换为 UTC 后正在使用,请完全避免使用或使用 .to_dateto_time
0赞 Akash Kinwad 2/20/2023
avoid 或 using 将始终返回 false,因为它是过去的时间而不是过去的日期。to_dateto_time
0赞 AbM 2/20/2023
DateTime.parse(time).utc.to_date #=> Mon, 06 Feb 2023与。DateTime.parse(time).to_date #=> Tue, 07 Feb 2023

答:

1赞 max 2/21/2023 #1

如果检查定义,它只是定义为:

# Returns true if the date/time is in the past.
def past?
  self < self.class.current
end

current当 或 被设置时返回,否则只返回 .Time.zone.nowTime.zoneconfig.time_zoneTime.now

这会导致一个真正的问题,因为您将 UTC 中的某个时间与另一个时区的当前时间进行比较,并且没有考虑 TZ。<

如果您想进行比较并避免此问题,请确保两个操作数都在同一个 TZ 中:

date = DateTime.parse(time).utc.to_date
date < Time.now.utc