2012-03-01 57 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