我希望在schema.org的rails上以ruby的iso8601格式输出持续时间。我已经知道如何在iso8601中输出时间戳。例如video.created_at.iso8601
我现在要做的是输出格式为:
<meta itemprop="duration" content="PT1M33S" />
这是iso8601持续时间格式。您可以在http://en.wikipedia.org/wiki/ISO_8601#Durations
上阅读有关规范的信息目前我正在攻击strftime,但这并不理想......
Time.at(@video.duration).strftime('PT%MM:%SS')
会欣赏更优雅的解决方案。还有一个足够智能,可以在需要时处理数小时等。我依赖ActiveSupport等没有问题,因为它将在Rails 3.2应用程序中。谢谢!
答案 0 :(得分:2)
这对我有用,输出是什么:
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时间戳。你可以用这个东西来实现你的目标:
答案 1 :(得分:2)
如果您仍在寻找答案,请查看ruby-duration gem。
答案 2 :(得分:1)
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