我在Ruby中的日期,日期时间和时间之间有点混淆。更重要的是,我的应用程序对时区很敏感,而且我不确定如何在时区强大的情况下如何在这三者之间进行转换。
如何检查两个unix时间戳(自纪元以来的秒数)是否代表同一天? (我真的不介意它是否使用当地时间或UTC;虽然我更喜欢当地时间,只要它是一致的,我可以围绕它设计。)
答案 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
这样,时区不会受到影响。