我正在尝试从DateTime对象(在我的示例中表示为“ at”)中提取时间分量。我该怎么办,我很沮丧吗?(我不想像strftime
我在这里那样将其解析为字符串):
@session_date.at.strftime("%H:%M")
我真的很想将小时和分钟作为Time对象返回。
您是否需要时间对象的特定原因?
就像我们清楚地知道的那样,Ruby中的Time类不仅仅是“没有日期的DateTime”。正如“ Ruby中的DateTime和Time有什么区别? ”解释说,“ Time是POSIX标准time_t的包装,或者是自1970年1月1日以来的秒数。” 与DateTime一样,Time对象仍然具有年,月和日,因此使用Time并不会带来任何好处。确实没有一种方法可以使用Time或DateTime来仅表示小时和分钟。
我认为,使用Time可以做的最好的事情是:
date_time = DateTime.now
seconds = date_time.hour * 60 * 60 + date_time.minute * 60
time = Time.at(seconds)
# => 1970-01-01 09:58
...但是随后您仍然必须致电time.hour
并time.min
获取小时和分钟。
但是,如果您只是在寻找一个轻量级的数据结构来表示小时和分钟,那么您也可以自己滚动:
HourAndMinute = Struct.new(:hour, :minute) do
def self.from_datetime(date_time)
new(date_time.hour, date_time.minute)
end
end
hm = HourAndMinute.from_datetime(DateTime.now)
# => #<struct HourAndMinute hour=15, minute=58>
hm.to_h
# => { :hour => 15, :minute => 58 }
hm.to_a
# => [ 15, 58 ]
我有一个存储约会的变量-该变量是DateTime对象。我有两个表字段,用于存储位置的开始时间和结束时间。我需要检查为该约会安排的时间是否在开始时间和结束时间之间。
嗯,看来您有点XY问题。现在,这变得更加有意义。
缺少更多信息,我将假设您的“存储位置开始时间和结束时间的字段”是TIME
称为start_time
和的MySQL列end_time
。给定MySQL TIME列,Rails将日期分量设置为1/1/2000的值强制转换为Time对象。所以,如果你的数据库具有价值start_time = '09:00'
和end_time = '17:00'
,Rails会给予你时对象是这样的:
start_time = Time.new(2000, 1, 1, 9, 0) # => 2000-01-01 09:00:00 ...
end_time = Time.new(2000, 1, 1, 17, 0) # => 2000-01-01 17:00:00 ...
现在,您说您的约会时间是一个DateTime,因此我们将其称为appointment_datetime
明天时间是10:30:
appointment_datetime = DateTime.new(2014, 11, 18, 10, 30) # => 2014-11-18 10:30:00 ...
所以,现在要改一下你的问题:我们如何告诉我们,如果时间的部分appointment_datetime
是与时间的部分start_time
和end_time
。答案是,我们需要更改的日期部分start_time
并end_time
使其匹配的日期部分appointment_datetime
,或者相反。由于更改一件事情要比更改一件事情容易,因此让我们采用另一种方法来更改appointment_datetime
并匹配start_time
,end_time
(并且,由于这两个是Time对象,因此我们将创建一个Time对象):
appointment_time = DateTime.new(2000, 1, 1, appointment_datetime.hour, appointment_datetime.minute)
# => 2000-01-01 10:30:00 ...
现在我们可以直接比较它们:
if appointment_time >= start_time && appointment_time <= end_time
puts "Appointment time is good!"
end
# Or, more succinctly:
if (start_time..end_time).cover?(appointment_time)
puts "Appointment time is good!"
end
当然,您可能希望将所有这些都包装在一个方法中,也许是在您的Location模型中(同样,我假设hasstart_time
和end_time
attribute):
class Location < ActiveRecord::Base
# ...
def appointment_time_good?(appointment_datetime)
appointment_time = DateTime.new(2000, 1, 1,
appointment_datetime.hour, appointment_datetime.minute)
(start_time..end_time).cover?(appointment_time)
end
end
location = Location.find(12) # => #<Location id: 12, ...>
location.appointment_time_good?(appointment_time) # => true
希望对您有所帮助!
PS实现此目的的另一种方法是完全放弃日期/时间对象并进行直接的数值比较:
def appointment_time_good?(appointment_datetime)
appointment_hour_min = [ appointment_datetime.hour, appointment_datetime.minute ]
appointment_hour_min >= [ start_time.hour, start_time.min ]
&& appointment_hour_min <= [ end_time.hour, end_time.min ]
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句