2012-03-01 39 views
3

我正在寻找输出持续时间iso8601格式在ruby的rails for schema.org。我已经知道如何在iso8601中输出时间戳了。例如video.created_at.iso8601输出红宝石持续时间在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

是的。正如我在回答中所说的,我知道如何使用iso8601。我在说有没有一种方法可以使用它的持续时间格式:http://en.wikipedia.org/wiki/ISO_8601#Durations – 2012-03-02 14:34:14

回答

2

如果你还在寻找一个答案,看看红宝石持续时间的宝石。

+0

哇。我花了这么长时间回来找到你的答案是一个白痴,但这是一个窍门。耻辱我不得不为它添加依赖关系,但卖了。 – 2012-10-03 21:43:31

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时间戳一块。您可以使用此啄你的目标,那么:

https://github.com/arnau/ISO8601

+0

添加了一个带有表达式的编辑,以返回您正在查找的内容。 – dimitarvp 2012-03-01 20:13:06

+0

只有在小于1小时的时间内不起作用。例如Time.at(60).iso8601 [10,9] =>“T19:01:00” – 2012-03-01 22:40:40

+0

这是您的时区的错。 ;)我已经用解决方案更新了我的答案。 – dimitarvp 2012-03-02 00:39:04

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