Ruby on rails RubyonRails从datetime解析时间,而不是作为字符串

Ruby on rails RubyonRails从datetime解析时间,而不是作为字符串,ruby-on-rails,ruby,datetime,Ruby On Rails,Ruby,Datetime,我试图从DateTime对象(在我的示例中表示为“at”)中提取时间组件。我怎么做,我完全被难倒了?(我不想像我在这里做的那样,用strftime将其解析为字符串): 我很想将小时和分钟作为时间对象返回。如果您有DateTime对象: date_time = DateTime.now date_time.hour # => 16 date_time.minute # => 1 appointment_time = DateTime.new(2000, 1, 1, appointm

我试图从DateTime对象(在我的示例中表示为“at”)中提取时间组件。我怎么做,我完全被难倒了?(我不想像我在这里做的那样,用
strftime
将其解析为字符串):


我很想将小时和分钟作为时间对象返回。

如果您有DateTime对象:

date_time = DateTime.now

date_time.hour
# => 16
date_time.minute
# => 1
appointment_time = DateTime.new(2000, 1, 1, appointment_datetime.hour, appointment_datetime.minute)
# => 2000-01-01 10:30:00 ...

如果您正在用Word(Rails应用程序中很常见)查找从现在起的时间,那么这可能是一个很好的读物:

您需要时间对象的具体原因是什么

我们很清楚,Ruby中的类不仅仅是“没有日期的DateTime”。正如“”所解释的,“时间是POSIX标准时间的包装,即1970年1月1日以来的秒数。”与DateTime一样,时间对象仍然有年、月和日,因此使用时间并不能真正获得任何收益。实际上,没有一种方法可以用时间或日期时间来表示小时和分钟

我认为,你能用时间做的最好的事情是:

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 ]
现在你说你的约会时间是一个日期时间,所以我们把它叫做
appointment\u DateTime
,假设它是明天上午10:30:

appointment_datetime = DateTime.new(2014, 11, 18, 10, 30) # => 2014-11-18 10:30:00 ...
现在我们来重新表述你的问题:
appointment\u datetime
的时间部分是否介于
start\u time
end\u time
之间。答案是,我们需要更改
开始时间
结束时间
的日期部分,以匹配
约会日期时间
的日期部分,或者相反。因为改变一件事比改变两件事容易,所以让我们换一种方式,改变
约会日期时间
以匹配
开始时间
结束时间
(因为这两件事都是时间对象,我们将创建一个时间对象):

现在我们可以直接比较它们:

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
我希望这会有帮助

另一种实现方法是完全抛弃日期/时间对象,直接进行数字比较:

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
def约会时间(约会日期时间)
约会时间分钟=[约会时间小时,约会时间分钟]
约会时间>=[开始时间.hour,开始时间.min]

&&预约时间为什么不?这似乎是这样做的标准方法?因为出于我的目的,我不希望DateTime对象被解析为字符串,我需要几分钟和几小时的时间来测试它是否介于开始时间和结束时间(两个时间对象)Read@Jordan's responseHmm我想我不需要键值对。如果我详细说明我的目的,也许会有所帮助。我有一个存储约会的变量——这个变量是DateTime对象。我有两个表字段,用于存储位置的开始时间和结束时间。我需要检查预约的时间是否介于开始时间和结束时间之间。非常感谢!最后一部分肯定解决了我的问题,我会投票给你,但遗憾的是我没有足够的声誉这么做。
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
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
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