Ответ 1
В конце концов я отклонил предложение в @tokland ответить. Не совсем уверен, как сделать его подходящим камнем, но в настоящее время он работает для меня:
В С# есть класс TimeSpan. Он представляет собой период времени и возвращается из многих вариантов обработки даты. Вы можете создать его и добавить или вычесть из даты и т.д.
В Ruby и особенно рельсах, похоже, много классов даты и времени, но ничего, что представляет собой промежуток времени?
В идеале мне нужен объект, который я мог бы использовать для вывода форматированных дат достаточно легко, используя стандартные параметры форматирования даты.
например.
ts.to_format("%H%M")
Есть ли такой класс?
Еще лучше было бы, если бы я мог сделать что-то вроде
ts = end_date - start_date
Я знаю, что вычитание двух дат приводит к количеству секунд, отделяющих указанные даты, и что я мог бы все это исправить.
В конце концов я отклонил предложение в @tokland ответить. Не совсем уверен, как сделать его подходящим камнем, но в настоящее время он работает для меня:
Вы можете сделать что-то подобное:
irb(main):001:0> require 'time' => true
irb(main):002:0> initial = Time.now => Tue Jun 19 08:19:56 -0400 2012
irb(main):003:0> later = Time.now => Tue Jun 19 08:20:05 -0400 2012
irb(main):004:0> span = later - initial => 8.393871
irb(main):005:0>
Это просто возвращает время в секундах, на которое не все так красиво смотреть, вы можете использовать функцию strftime()
, чтобы сделать ее красивой:
irb(main):010:0> Time.at(span).gmtime.strftime("%H:%M:%S") => "00:00:08"
Что-то вроде этого? https://github.com/abhidsm/time_diff
require 'time_diff'
time_diff_components = Time.diff(start_date_time, end_date_time)
Нет, это не так. Вы можете просто добавить секунды или использовать метод advance
.
end_date - start_date
будет иметь тип Float
Еще не @toxaq... но я что-то начал!
https://gist.github.com/thatandyrose/6180560
class TimeSpan
attr_accessor :milliseconds
def self.from_milliseconds(milliseconds)
me = TimeSpan.new
me.milliseconds = milliseconds
return me
end
def self.from_seconds(seconds)
TimeSpan.from_milliseconds(seconds.to_d * 1000)
end
def self.from_minutes(minutes)
TimeSpan.from_milliseconds(minutes.to_d * 60000)
end
def self.from_hours(hours)
TimeSpan.from_milliseconds(hours.to_d * 3600000)
end
def self.from_days(days)
TimeSpan.from_milliseconds(days.to_d * 86400000)
end
def self.from_years(years)
TimeSpan.from_days(years.to_d * 365.242)
end
def self.diff(start_date_time, end_date_time)
TimeSpan.from_seconds(end_date_time - start_date_time)
end
def seconds
self.milliseconds.to_d * 0.001
end
def minutes
self.seconds.to_d * 0.0166667
end
def hours
self.minutes.to_d * 0.0166667
end
def days
self.hours.to_d * 0.0416667
end
def years
self.days.to_d * 0.00273791
end
end