问题 Ruby在C#中是否具有与TimeSpan相同的功能?


在C#中有一个TimeSpan类。它表示一段时间,并从许多日期操作选项返回。您可以创建一个并添加或减去日期等。

在Ruby和特定的rails中,似乎有很多日期和时间类,但没有代表一段时间的东西?

理想情况下,我想要一个可以使用标准日期格式选项轻松输出格式化日期的对象。

例如。

ts.to_format("%H%M")

有这样的课吗?

如果我可以做类似的事情,那就更好了

   ts = end_date - start_date

我知道减去两个日期会导致分隔所述日期的秒数,并且我可以从中完成所有日期。


8929
2018-06-19 12:17


起源



答案:


你可以做类似这样的事情:

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"

6
2018-06-19 12:21



这恰好正是我现在正在做的事情。它确实具有不能显示超过24小时的时差的限制。 - toxaq
@toxaq时间实际上是日期和时代的抽象,考虑到这个名字可能会令人困惑。您可以为给定的年/月/日/小时/分钟/秒制作时间对象,并对它们执行加法和减法。 ruby-doc.org/core-1.9.3/Time.html - Hunter McMillen
这是关于时间跨度的有趣事情,它没有关于其他东西的概念。它只是一个美化的int,有一些很好的访问方法。 - toxaq


答案:


你可以做类似这样的事情:

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"

6
2018-06-19 12:21



这恰好正是我现在正在做的事情。它确实具有不能显示超过24小时的时差的限制。 - toxaq
@toxaq时间实际上是日期和时代的抽象,考虑到这个名字可能会令人困惑。您可以为给定的年/月/日/小时/分钟/秒制作时间对象,并对它们执行加法和减法。 ruby-doc.org/core-1.9.3/Time.html - Hunter McMillen
这是关于时间跨度的有趣事情,它没有关于其他东西的概念。它只是一个美化的int,有一些很好的访问方法。 - toxaq


像这样的东西? https://github.com/abhidsm/time_diff

require 'time_diff'
time_diff_components = Time.diff(start_date_time, end_date_time)

3
2018-06-19 12:25



看起来很有意思,谢谢。不是我想要的,但我绝对可以使用它或推导。 - toxaq


不,它没有。你可以添加秒或使用 advance 方法。

end_date - start_date 会有的 Float 类型


1
2018-06-19 12:21





最后,我在@ tokland的回答中提出了这个建议。不太确定如何使它成为一个合适的宝石,但它目前正在为我工​​作:

Timespan fork of time_diff


1
2018-06-20 02:45



匿名的downvoters是跛脚的。 - toxaq


还没有@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

0
2017-08-08 01:51



很酷,非常类似于宝石托克兰所建议的,我分叉得到我想要的东西。 - toxaq