检查Ruby中是否有两个时间戳是同一天

时间:2011-12-18 08:19:51

标签: ruby date time

我在Ruby中的日期,日期时间和时间之间有点混淆。更重要的是,我的应用程序对时区很敏感,而且我不确定如何在时区强大的情况下如何在这三者之间进行转换。

如何检查两个unix时间戳(自纪元以来的秒数)是否代表同一天? (我真的不介意它是否使用当地时间或UTC;虽然我更喜欢当地时间,只要它是一致的,我可以围绕它设计。)

4 个答案:

答案 0 :(得分:40)

使用标准库,将Time对象转换为Date。

require 'date'

Time.at(x).to_date === Time.at(y).to_date

Date有===方法,如果两个日期对象代表同一天,则该方法为真。

答案 1 :(得分:5)

ActiveSupport为Time类定义了不错的to_date method。这就是它的样子:

class Time
  def to_date
    ::Date.new(year, month, day)
  end
end

使用它可以比较这样的时间戳:

Time.at(ts1).to_date === Time.at(ts2).to_date

如果没有扩展Time类,这里的争议较少:

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1
t2 = Time.at(ts2)
Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day)

答案 2 :(得分:2)

Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400

或者

t1 = Time.at(ts1)
t2 = Time.at(ts2)
t1.yday == t2.yday && t1.year == t2.year

在第一种情况下,我们确保时间戳不超过一天(因为#day返回月中的日期而没有这个额外的检查4月1日将等于5月1日)

另一种方法是每年进行一天,并确保它们属于同一年。

这些方法在1.8和1.9中同样有效: - )

答案 3 :(得分:2)

我们可以使用beginning_of_day的时间并比较它们: t1.beginning_of_day == t2.beginning_of_day 这样,时区不会受到影响。