0

我正在解决我在互联网上发现的一个问题:

人体在夜间会经历 90 分钟的睡眠周期,如果您在睡眠周期结束时醒来,您会比在睡眠周期中醒来时感觉更神清气爽。挑战在于制作一个程序,该程序需要唤醒时间并输出入睡的可能时间,以便您在睡眠周期结束时醒来。*

DateTime我解决这个问题的方法是在将其解析为并将其存储到数组中之后从时间中减去 90m 。但是,我是 Rails 的新手,不太确定如何执行此操作。如何以原始格式显示我的时间?

这是我到目前为止所拥有的:

require 'date'

def sleep_time time
  a = []

  5.times do |i|
    multiple = i * 90 * 60
    a << time - multiple
  end

  puts a
end

puts "Enter wake-up time: "
time = DateTime.strptime(gets, '%I:%M %p').to_time

puts time
sleep_time(time)

编辑:我想出了如何减去 90m(使用秒)。

4

2 回答 2

1

时间支持strftime,它采用与 一致的格式字符串strptime。利用:

time.strftime('%I:%M %p')

例如:

Time.now.strftime('%I:%M %p')
=> "01:29 PM"

此外,不要将其解析为 DateTime 对象,然后使用to_time. 而是直接解析为 Time 对象。时间strptime还支持:

require 'time'
Time.strptime('01:29 PM', '%I:%M %p')
=> 2012-09-20 13:29:00 -0700

如果要从给定格式解析,然后再次以该格式输出,定义一个常量并在strptimeandstrftime方法中使用它:

TIME_FORMAT = '%I:%M %p'
Time.strptime('01:29 PM', TIME_FORMAT)
time.strftime(TIME_FORMAT)
于 2012-09-20T20:29:07.277 回答
0

如果您使用 ActiveSupport Extensions,您可以使用1.day + 90.minutes - 10.seconds. 你在这里找到。

# ActiveSupport Extensions will us allow to use 90.minutes
require 'active_support/all'

def go_to_sleep_at(end_time, sleep_cycles = 5)
  # Parse input into time object
  end_time = Time.parse(end_time)
  # Add one day
  end_time += 1.day if end_time.past?

  # Calculate start times
  start_times = []
  (1..sleep_cycles).each {|i| start_times << end_time - (90.minutes * i)}

  # Define output format
  time_format = '%H:%M %p'

  # Format times
  end_time = end_time.strftime(time_format)
  start_times.map!{|t| t.strftime(time_format)}.reverse!

  # Return output
  return "If you want to wake up at #{ end_time } you can go to sleep at #{start_times[0..-2].join(', ')} or #{start_times.last}."
end

p go_to_sleep_at('06:00')
# => "If you want to wake up at 06:00 AM you can go to sleep at 22:30 PM, 00:00 AM, 01:30 AM, 03:00 AM or 04:30 AM."

只是无数解决方案之一:-D

于 2012-09-20T21:15:10.847 回答