我在Ruby中的Date、Datetime和Time这三个概念比较混淆。而且,我的应用对时区很敏感,我不确定如何在保持时区鲁棒性的同时,在这三个概念之间进行转换。
如何检查两个Unix时间戳(自纪元以来的秒数)是否表示同一天?(实际上,使用本地时间或UTC都可以;虽然我更喜欢使用本地时间,但只要是一致的,我就可以设计解决方案)。
require 'date'
Time.at(x).to_date === Time.at(y).to_date
Date对象有===
方法,如果两个Date对象表示同一天,则返回true。
ActiveSupport为Time
类定义了一个不错的to_date
方法,如下所示:
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)
Ruby
;我认为假设他在使用Rails是不公平的。 - mačekTime.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
beginning_of_day
方法并进行比较:
t1.beginning_of_day == t2.beginning_of_day
这样时区就不会受到影响。
Time
已经是“带时间的日期”。在这里,我们试图忽略时间组件。 - Sergio Tulentsev