घंटे: मिनट: सेकंड (या समान) रेल 3 या रूबी में अवधि परिवर्तित करें


115

मुझे लगता है कि ऐसा करने का एक सरल / अंतर्निहित तरीका है, लेकिन मुझे यह नहीं मिल रहा है।

मेरे पास एक पूर्णांक में एक अवधि (सेकंड में) है और मैं इसे एक दोस्ताना प्रारूप में प्रदर्शित करना चाहता हूं।

उदाहरण के लिए 3600 को "01:00:00" या "1 घंटा" या कुछ और के रूप में प्रदर्शित किया जाएगा।

मैं इसे कर सकता हूं time_ago_in_words(Time.zone.now+3600)लेकिन यह एक हैक की तरह महसूस होता है, वर्तमान समय से जोड़ने / घटाने का कोई कारण नहीं है बस इस मूल्य को प्रारूपित करें। duration_in_words()कुछ है या नहीं?

धन्यवाद

जवाबों:


83

देखें: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelb.html

distance_of_time_in_words(3600)
 => "about 1 hour"

1
धन्यवाद मैं उस पर देखा, लेकिन मुझे लगता है कि दो बार प्रदान करना था .. क्या एक नब!
cydonia

1
हाँ, उन उदाहरणों में बेअदबी है
एलन नो

1
दूरी_ऑफ_टाइम_इन_ पासवर्ड (from_time, to_time, ...)
बोल्डर_ब्रुबी

1
इसके अलावा, यदि आप चाहते हैं कि यह बहुत विशिष्ट हो और अवधि "राउंड" न हो, तो रडार के मणि की जाँच करें: github.com/radar/distance_of_time_in_words । के लिए ड्रॉप-इन प्रतिस्थापन distance_of_time_in_wordsऔर आप vague: trueएक विकल्प के रूप में पास करके गोल संख्या प्राप्त कर सकते हैं ।
यहोशू पिंटर

194

उपसंहार:

मानाकि total_seconds = 3600

विकल्प 1:

distance_of_time_in_words(total_seconds) #=> "about 1 hour"

विकल्प 2:

Time.at(total_seconds).utc.strftime("%H:%M:%S") #=> "01:00:00"

विकल्प 3:

seconds = total_seconds % 60
minutes = (total_seconds / 60) % 60
hours = total_seconds / (60 * 60)

format("%02d:%02d:%02d", hours, minutes, seconds) #=> "01:00:00"

Option1 का उपयोग करें यदि आप शब्दों को चाहते हैं, Option2 यदि आप एच: एम: एस प्रारूप चाहते हैं , तो विकल्प 3 यदि आप एच: एम: एस प्रारूप चाहते हैं और 24 घंटे से अधिक हो सकते हैं


1
दूरी_ऑफ_टाइम_इन_ पासवर्ड विधि एक एक्शन व्यू हेल्पर है, इसलिए इसे व्यू (नियंत्रक नहीं) से बुलाया जाना चाहिए। api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
msdundar

13
ध्यान दें कि स्ट्रैपटाइम विकल्प 24 घंटे में बह जाएगा। यदि आपकी अवधि 25 घंटे है, तो यह प्रदर्शित होगा 01:00:00
गेबे मार्टिन-डेमस्पी 17

2
यह नकारात्मक समय के लिए काम नहीं करता है, उदाहरण के लिए -1800 रिटर्न -30 एम के बजाय -30 एम
अर्नोल्ड

44

रूबी का स्ट्रिंग %संचालक भी अप्राप्य है और अक्सर भूल जाता है।

"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]

यह देखते हुए टी सेकंड में एक अवधि है, इस दिन सहित एक शून्य गद्देदार पेट-सपरेटेड स्ट्रिंग का उत्सर्जन करता है। उदाहरण:

t = 123456
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
=> "01:10:17:36"

लवली।


24
यह "प्यारी" की एक अजीब परिभाषा है।
मार्क बोलिंगर

10
%कहते हैं, "मेरा अधिकार से पैरामीटर की सरणी ले लो और उन्हें अपने बाईं तरफ के प्रारूप स्ट्रिंग में सम्मिलित करें।" उस संबंध में, यह printfC \ C ++ के समान है केवल अधिक संक्षिप्त और एक असाइनमेंट में उपयोग किया जा सकता है। हां, मुझे वह प्यारी लगती है। और शक्तिशाली। ऐसे उदाहरण हैं जो इस वाक्पटुता को बेहतर प्रदर्शित करेंगे, लेकिन वे इस सवाल का जवाब नहीं देंगे। आपका स्नार्क सराहना नहीं है, btw।
IANNNN

26

मुझे लगता है कि आप भी कुछ ऐसा कर सकते हैं:

(Time.mktime(0)+3600).strftime("%H:%M:%S")

अपनी इच्छानुसार इसे प्रारूपित करने के लिए।

BTW, मूल रूप से मैंने Time.at () का उपयोग करने के बारे में सोचा था, लेकिन ऐसा लगता है कि मेरे उबंटू पर © समय थू जन 01 01:00:00 +0100 1970 है और 00:00:00 घंटे जैसा कि मुझे उम्मीद थी, और इसलिए अगर मैं करता हूं:

Time.at(3600).strftime("%H:%M:%S")

मुझे 1 घंटा ज्यादा चाहिए था।


आह, गर्मी के समय के कारण कुछ करना पड़ सकता है?
क्रिस्टोबाल विद्मा

7
यदि आप 24 घंटे से अधिक समय के साथ काम कर रहे हैं तो एकमात्र पकड़ है उस स्थिति में घंटे कम संख्या में वापस आ जाएंगे।
15

24 घंटे से अधिक समय के लिए,% j आपको दिनों की संख्या देगा (जब तक कि यह 365 से कम है)
BananaNeil

18

मैं अपनी रेल परियोजना में समय अवधि दिखाने के लिए इसका उपयोग करता हूं:

  1. Integerवर्ग में एक कस्टम विधि जोड़ें । आप फ़ोल्डर pretty_duration.rbमें एक नई फ़ाइल बना सकते हैं initializers:

    class Integer
        def pretty_duration
            parse_string = 
                if self < 3600
                    '%M:%S'
                else
                    '%H:%M:%S'
                end
    
            Time.at(self).utc.strftime(parse_string)
        end
    end
  2. seconds.pretty_durationअपने प्रोजेक्ट में कहीं भी कॉल करें:

    275.pretty_duration     # => "04:35"
    9823.pretty_duration    # => "02:43:43"

यह उत्तर लेव लुकोम्स्की के कोड पर बनता है


बढ़िया काम किया। इसके लिए शुक्रिया।
डॉन फेलकर

13

यह एक divmodही समय में विभाजित करने और मोड्यूल करने के लिए अस्पष्ट विधि का उपयोग करता है , इसलिए यह Floatसेकंड को ठीक से संभालता है:

def duration(seconds)
  minutes, seconds = seconds.divmod(60)
  hours, minutes = minutes.divmod(60)
  days, hours = hours.divmod(24)

  "#{days.to_s.rjust(3)}d #{hours.to_s.rjust(2)}h #{minutes.to_s.rjust(2)}m #{seconds}s"
end

6

Time.utc.strftimeकेवल मान के लिए काम का उपयोग करना जब कुल घंटों की संख्या कम हो तो 24 :

2.2.2 :004 > Time.at(60 * 60).utc.strftime('%H h %M m')
=> "01 h 00 m"

अधिक मूल्यों के लिए यह गलत परिणाम देता है:

2.2.2 :006 > Time.at(60 * 60 * 24).utc.strftime('%H h %M m')
 => "00 h 00 m"

मेरा सुझाव है कि मैं इस समस्या के लिए सबसे सरल विधि का उपयोग करूं:

  def formatted_duration total_seconds
    hours = total_seconds / (60 * 60)
    minutes = (total_seconds / 60) % 60
    seconds = total_seconds % 60
    "#{ hours } h #{ minutes } m #{ seconds } s"
  end

आप हमेशा अपनी आवश्यकताओं के लिए लौटाया गया मान समायोजित कर सकते हैं।


5

एक दिन से अधिक की अवधि के साथ सावधान रहें।

(timing/3600).to_i.to_s.rjust(2,'0') + ":"+Time.at(timing).utc.strftime("%M:%S")

इनपुट / आउटपुट का एक उदाहरण दें जो यह बताता है कि यह कोने के मामले को कैसे हल करता है
सिरिल डचोन-डोरिस

4

ActiveSupport :: अवधि, और हैंडलिंग मिलीसेकंड (बेंचमार्क कोड के लिए उपयोगी) का लाभ उठाने वाले लेव लुकोम्स्की से प्रेरित एक उत्तर

# duration in ms modulus number of ms in one second
milliseconds = duration.in_milliseconds % 1.second.in_milliseconds

# duration in seconds modulus number of seconds in one minute
seconds = (duration / 1.second) % (1.minute / 1.second)

# duration in minutes modulus number of minutes in one hour
minutes = (duration / 1.minute) % (1.hour / 1.minute)

# duration in hours modulus number of hours in one day
hours = (duration / 1.hour) % (1.day / 1.hour)

format("%02d:%02d:%02d:%03d", hours, minutes, seconds, milliseconds) #=> "12:05:00:001"

बेशक आप संबंधित ActiveSupport विधियों का उपयोग करके और समान संरचना को दोहराते हुए इसे आसानी से दिनों, महीनों, वर्षों आदि के साथ बढ़ा सकते हैं।

ध्यान रखें कि बहुत अधिक अवधि के लिए, यह गलत हो सकता है क्योंकि 1 महीने की अवधि निश्चित नहीं है, और मुझे यकीन नहीं है कि एएस: अवधि इसके साथ कैसे संबंधित है।


2

बस मेरे 2 सेंट में फेंकने के लिए:

Time.at(i).utc.strftime((i < 3600) ? '%-M minutes and %-S seconds' : '%-H hours, %-M minutes, and %-S seconds')

जिओ बिन के जवाब से दूर।


2

@Joshuapinter को चिल्लाएँ जिन्होंने सबसे अच्छा जवाब दिया ( टिप्पणी के रूप में )।

ड्रॉप-इन प्रतिस्थापन का उपयोग करें dotiwविभिन्न आवश्यकताओं के अनुरूप उत्पादन की सटीकता पर अधिक नियंत्रण प्राप्त करने के लिए रत्न का :

https://github.com/radar/distance_of_time_in_words

नमूना दृश्य कोड:

%label
  Logoff after:
  - expire_in = distance_of_time_in_words(Time.now, Time.now + user.custom_timeout.minutes, :only => [:minutes, :hours, :days])
  = expire_in

कुछ इस तरह से परिणाम:

Logoff after: 1 day, 13 hours, and 20 minutes

2

ActiveSupport::Duration.build+ inspectआपको मान्य परिणाम देता है

 >> ActiveSupport::Duration.build(125557).inspect
 => "1 day, 10 hours, 52 minutes, and 37 seconds"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.