在iso8601中输出Ruby持续时间

我希望在schema.org上的ruby轨道上以iso8601格式输出持续时间。 我已经知道如何输出iso8601中的时间戳。 例如video.created_at.iso8601

我现在要做的是输出格式为:

 

这是iso8601持续时间格式。 您可以在http://en.wikipedia.org/wiki/ISO_8601#Durations上阅读有关规范的内容

目前我正在攻击一个strftime,但那并不理想……

 Time.at(@video.duration).strftime('PT%MM:%SS') 

希望得到更优雅的解决方案。 一个聪明到足以处理需要的时间等。 我依赖ActiveSupport等没有问题,因为它将在Rails 3.2应用程序中。 谢谢!

如果您仍在寻找答案,请查看ruby-duration gem。

这对我有用,输出是什么:

 ruby-1.9.2-head :004 > require 'time' => true ruby-1.9.2-head :005 > Time.at(1000).iso8601 => "1970-01-01T02:16:40+02:00" ruby-1.9.2-head :012 > Time.at(1000).getgm.iso8601[10,9] => "T00:16:40" ruby-1.9.2-head :011 > Time.at(60).getgm.iso8601[10,9] => "T00:01:00" 

通过使用getgm ,您可以消除时区的副作用。

编辑:没有意识到你想要ISO8601中的持续时间 – 认为你想要一个完全格式化的ISO8601时间戳。 你可以用这个东西来实现你的目标:

https://github.com/arnau/ISO8601

 def time_to_iso8601(time) # http://www.ostyn.com/standards/scorm/samples/ISOTimeForSCORM.htm # P[yY][mM][dD][T[hH][mM][s[.s]S]] minute = 60 hour = minute * 60 day = hour * 24 year = day * 365.25 month = year / 12 if time.acts_like?(:time) time.iso8601 elsif time.kind_of?(Numeric) time = time.to_f return "PT0H0M0S" if time == 0 parts = ["P"] parts << "#{(time / year).floor}Y" if time >= year parts << "#{(time % year / month).floor}M" if time % year >= month parts << "#{(time % month / day).floor}D" if time % month >= day time = time % month parts << "T" if time % day > 0 parts << "#{(time % day / hour).floor}H" if time % day >= hour parts << "#{(time % hour / minute).floor}M" if time % hour >= minute parts << "#{(time % 1 == 0 ? time.to_i : time) % minute}S" if time % minute > 0 return parts.join end end 
Interesting Posts