সময়কালকে ঘন্টার মধ্যে রূপান্তর করুন: মিনিট: সেকেন্ড (বা অনুরূপ) রেল 3 বা রুবিতে


115

এটি করার একটি সহজ / অন্তর্নির্মিত উপায় আছে বলে আমার অনুভূতি রয়েছে তবে আমি এটি খুঁজে পাচ্ছি না।

আমার পূর্ণসংখ্যায় একটি সময়কাল (সেকেন্ডে) হয় এবং আমি এটি বন্ধুত্বপূর্ণ বিন্যাসে প্রদর্শন করতে চাই।

যেমন 3600 "01:00:00" বা "1 ঘন্টা" বা অন্য কিছু হিসাবে প্রদর্শিত হবে।

আমি এটি দিয়ে করতে পারি time_ago_in_words(Time.zone.now+3600)তবে এটি হ্যাকের মতো মনে হয়, কেবলমাত্র এই মানটি ফর্ম্যাট করার জন্য বর্তমান সময় থেকে যোগ / বিয়োগ করার কোনও কারণ নেই। একটি duration_in_words()বা কিছু আছে?

ধন্যবাদ

উত্তর:


83

দেখুন: http://api.rubyonrails.org/class/ActionView/Helpers/DateHelper.html

distance_of_time_in_words(3600)
 => "about 1 hour"

1
ধন্যবাদ আমি এটি তাকিয়েছিলাম কিন্তু ভেবেছিলাম আমাকে দু'বার সরবরাহ করতে হবে .. কী নুব!
সাইডোনিয়া

1
হ্যাঁ, এই উদাহরণগুলি মূর্খ
অ্যালান

1
দূরত্ব_আর_সময়ের_ইন_ওয়ার্ডস (সময় থেকে, সময়_কাল, ...)
বোল্ডার_আরবি

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 আপনি এইচ চাই: এম: এস ফরম্যাট, Option3 আপনি এইচ চাই: এম: এস বিন্যাস এবং সেখানে এর থেকেও বেশী 24 ঘন্টার হতে পারে


1
দূরত্বের_পরে_মাম_ইন_ওয়ার্ডস পদ্ধতিটি একটি অ্যাকশনভিউ সহায়ক, সুতরাং ভিউ (নিয়ামক নয়) থেকে কল করা প্রয়োজন। api.rubyonrails.org/class/ActionView/Helpers/DateHelper.html
মিসদুন্দর

13
নোট করুন যে স্ট্রফটাইম বিকল্পটি 24 ঘন্টা উপচে পড়বে। যদি আপনার সময়কাল 25 ঘন্টা হয় তবে এটি প্রদর্শিত হবে 01:00:00
গ্যাব মার্টিন-ড্যাম্পেসি

2
এটি নেতিবাচক সময়গুলির জন্য কাজ করে না, উদাহরণস্বরূপ -1800 -30 মিটার পরিবর্তে -1 এইচ 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
%বলে, "আমার ডান থেকে পরামিতি অ্যারে নিন এবং তাদের আমার বাম ফরম্যাট স্ট্রিং মধ্যে সন্নিবেশ।" সেই ক্ষেত্রে, এটি printfসি \ সি ++ এর মতোই কেবল আরও সংক্ষিপ্ত এবং কোনও কার্যক্রমে ব্যবহার করা যেতে পারে। হ্যাঁ, আমি এই সুন্দর কল। এবং শক্তিশালী। এমন উদাহরণ রয়েছে যা এই স্পষ্টতাকে আরও ভালভাবে প্রদর্শন করবে তবে তারা প্রশ্নের উত্তর দেবে না। আপনার স্নার্ক প্রশংসিত হয় না, বিটিডাব্লু।
আইএএমএনএন

26

আমার ধারণা আপনিও এর মতো কিছু করতে পারেন:

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

এটি আপনার ইচ্ছামত বিন্যাস করতে।

বিটিডাব্লু, মূলত আমি টাইম.ট () ব্যবহার করার কথা ভেবেছিলাম তবে মনে হচ্ছে যে আমার উবুন্টুতে EPOCH সময়টি ছিল 01 জানু 01:00:00 +0100 1970 এবং আমার প্রত্যাশা অনুযায়ী 00:00:00 ঘন্টা নয়, এবং তাই যদি আমি করি:

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

আমাকে চেয়ে চেয়ে ১ ঘন্টা বেশি সময় দেয়।


আহ্, গ্রীষ্মের সময় কিছু করতে পারে?
ক্রিস্টোবাল ভিডমা

7
আপনি যদি ২৪ ঘন্টারও বেশি সময় নিয়ে ডিল করেন তবেই কেবল ধরা পড়বে। সেক্ষেত্রে ঘন্টাগুলি কম সংখ্যায় ফিরে যাবে।
মেটাভিডা

২৪ ঘণ্টার বেশি সময়ের জন্য,% j আপনাকে দিনের সংখ্যা দেবে (যতক্ষণ না এটি 365 এর চেয়ে কম)
কলানিয়েল

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

অ্যাক্টিভসপোর্ট :: সময়কাল এবং হ্যান্ডলিং মিলিসেকেন্ডগুলির সুবিধা (বেঞ্চমার্ক কোডের জন্য দরকারী) লেভ লুকমস্কির একের কাছ থেকে নেওয়া একটি উত্তর থেকে অনুপ্রাণিত উত্তর

# 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"

অবশ্যই আপনি দিন, মাস, বছর ইত্যাদির সাথে সম্পর্কিত এ্যাকটিভসপোর্ট পদ্ধতিগুলি ব্যবহার করে এবং একই কাঠামোর পুনরাবৃত্তি করে সহজেই এটিকে প্রসারিত করতে পারেন।

মনে রাখবেন যে খুব দীর্ঘ সময়সীমার জন্য, এটি ভুল হতে পারে যেহেতু 1 মাস সময়কাল দিনের সংখ্যায় স্থির থাকে না এবং আমি নিশ্চিত না যে এএস: সময়কাল এটির সাথে কীভাবে কাজ করে।


2

শুধু আমার 2 সেন্ট নিক্ষেপ করতে:

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

জিয়াও বিন এর উত্তর বন্ধ।


2

@ জোশুয়াপিন্টার কে চিত্কার করুন যিনি সেরা উত্তর দিয়েছেন ( একটি মন্তব্যের আকারে )।

ড্রপ-ইন প্রতিস্থাপন ব্যবহার করুন 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"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.