আমি রুবিতে মিলিসেকেন্ডে কীভাবে সময় পার করব?


100

আমার কাছে যদি কোনও Timeজিনিস পাওয়া যায়:

Time.now

এবং পরে আমি একই লাইন দিয়ে অন্য একটি বস্তু ইনস্ট্যান্ট করি, আমি কীভাবে দেখতে পাব যে কত মিলিসেকেন্ড পেরিয়ে গেছে? দ্বিতীয় অবজেক্টটি একই মিনিটে, পরবর্তী মিনিট বা এমনকি কয়েক ঘন্টা পর্যন্ত তৈরি হতে পারে।

উত্তর:


136

ইতিমধ্যে উল্লিখিত হিসাবে, আপনি Timeবস্তুর উপর এমনভাবে পরিচালনা করতে পারেন যেন তারা সংখ্যার (বা ভাসমান পয়েন্ট) মান। এই ক্রিয়াকলাপগুলির ফলে দ্বিতীয় রেজোলিউশনের ফলস্বরূপ যা সহজেই রূপান্তরিত হতে পারে।

উদাহরণ স্বরূপ:

def time_diff_milli(start, finish)
   (finish - start) * 1000.0
end

t1 = Time.now
# arbitrary elapsed time
t2 = Time.now

msecs = time_diff_milli t1, t2

সেটা কেটে ফেলবে কিনা তা আপনাকে সিদ্ধান্ত নিতে হবে।


4
একটি to_i যোগ করব এবং একটি পূর্ণসংখ্যা, যেমন যেমন আছে: ((ফিনিস - শুরুর) * 1000.0) .to_i
ট্রাভিস Reeder

finish.to_f - start.to_f?
বোডাকিয়াস

4
finish - startফলন ভাসমান পয়েন্ট; .to_fঅপ্রয়োজনীয় হবে।
ezpz

5
যদি রেল বা সক্রিয় সমর্থন ব্যবহার করে থাকেন তবে আপনি একই রূপান্তর করতে # ইন_মিলিসেকেন্ড পদ্ধতিটি ব্যবহার করতে পারেন(t2 - t1).in_milliseconds
নাথান হান্না

60

আপনি নিম্নলিখিতটি দিয়ে উপরের সমাধানটিতে কিছুটা সিনট্যাক্স চিনি যুক্ত করতে পারেন:

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

start_time = Time.now
sleep(3)
end_time = Time.now
elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004

31

আমি মনে করি উত্তরটি ভুলভাবে বেছে নেওয়া হয়েছে, সেই পদ্ধতিটি সেকেন্ড দেয়, মিলিসেকেন্ড নয়।

t = Time.now.t­o_f
=> 1382471965.146

এখানে আমি অনুমান করি যে ভাসমান মান হ'ল মিলিসেকেন্ড


4
নির্বাচিত উত্তরটি সঠিক। সংযোজন বা বিয়োগফলকে Time.nowব্যবহার করে সময়কে দশমিক বিন্দুর আগে সেকেন্ড সহ এবং দশমিক বিন্দুর পরে ন্যানোসেকেন্ড পর্যন্ত ভাসমান পয়েন্টের মান হিসাবে বিবেচনা করা হয় (যদিও এনসিএস পুরোপুরি সঠিক নাও হতে পারে)। সুতরাং যে মানটি 1000.0কয়েক মিলিয়ন সেকেন্ডের সাহায্যে গুন করে ।
dfherr

হ্যাঁ, তবে কেবল "টাইম.নো" দেওয়া ভুল এবং সঠিকভাবে প্রশ্নের উত্তর দেয় না।
লোফিল্ড থিরি

12

মিলি সেকেন্ডে সময় পেতে, এটি যুক্ত করা ভাল .round(3), তাই এটি কিছু ক্ষেত্রে আরও সঠিক হবে:

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578

9

ইজপিজের উত্তর প্রায় নিখুঁত, তবে আমি আশা করি আমি আরও কিছু যোগ করতে পারি।

জিও মিলিসেকেন্ডে সময় সম্পর্কে জিজ্ঞাসা করেছিল; এটি একটি পূর্ণসংখ্যার পরিমাণের মতো শোনাচ্ছে এবং আমি ভাসমান-পয়েন্টের জমি দিয়ে পথ ধরব না। সুতরাং আমার পদ্ধতির হবে:

irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940

পূর্ণসংখ্যা 1000 দ্বারা গুণিত করা ভগ্নাংশটি পুরোপুরি সংরক্ষণ করে এবং কিছুটা দ্রুতও হতে পারে।

আপনি যদি তারিখ এবং সময় নিয়ে কাজ করেন তবে আপনার ডেটটাইম ক্লাসটি ব্যবহার করতে হতে পারে । এটি একইভাবে কাজ করে তবে রূপান্তর ফ্যাক্টরটি 24 * 3600 * 1000 = 86400000

আমি তারিখসময় এর পেয়েছি strptime এবং strftime ফাংশন পার্স এবং তারিখ / সময় স্ট্রিং বিন্যাস অমূল্য (যেমন থেকে / লগ থেকে)। যা কাজে আসে তা হ'ল:

  • এই ফাংশনের (% এইচ,% এম,% এস, ...) বিন্যাস অক্ষরগুলি প্রায় কোনও ইউনিক্স / লিনাক্স সিস্টেমে পাওয়া সি ফাংশনের মতোই; এবং

  • আরও কয়েকটি রয়েছে: বিশেষত, % এল মিলিসেকেন্ডগুলি করে!


জানা ভাল! ধন্যবাদ unknown:)
জিও

4
যাইহোক% এল কেবলমাত্র রুবিতে উপস্থিত রয়েছে 1.9%)
রাফা দে কাস্ত্রো

7

%L রুবিতে মিলিসেকেন্ড দেয়

require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")

বা

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")

মিলিসেকেন্ডে আপনাকে বর্তমান টাইমস্ট্যাম্প দেবে।


এটি কীভাবে অতিবাহিত সময় পাবে তা বলে না।
রবার্ট


6

সময়.নো. টো_ফ আপনাকে সাহায্য করতে পারে তবে এটি কয়েক সেকেন্ড পরে ফিরে আসে।

সাধারণভাবে, আমি মাপদণ্ডের সাথে কাজ করার সময়:

  • বর্তমান সময়ে পরিবর্তনশীল রাখুন;
  • পরীক্ষা করতে ব্লকটি সন্নিবেশ করুন;
  • পূর্ববর্তী বর্তমান সময়ের মান বিয়োগ করে বর্তমান সময়ের একটি পরিবর্তনশীল রাখুন;

এটি একটি খুব সাধারণ প্রক্রিয়া, সুতরাং আমি নিশ্চিত না যে আপনি সত্যই এটি জিজ্ঞাসা করেছিলেন ...


4

উত্তরটি এরকম কিছু:

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0

তবে Time.now পদ্ধতির ভুল হওয়ার ঝুঁকি রয়েছে। আমি লুকা গুডির এই পোস্টটি পেয়েছি:

https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

সিস্টেমের ঘড়িটি ক্রমাগত ভাসমান এবং এটি কেবল সামনে অগ্রসর হয় না। আপনার অতিবাহিত সময়ের গণনা যদি এর উপর ভিত্তি করে থাকে তবে আপনি খুব সম্ভবত গণনার ত্রুটি বা বিভ্রাটের দিকে চলে যাবেন ।

সুতরাং, Process.clock_gettimeপরিবর্তে এটি ব্যবহার করার পরামর্শ দেওয়া হয়। কিছুটা এইরকম:

def measure_time
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  yield
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_time = end_time - start_time
  elapsed_time.round(3)
end

উদাহরণ:

elapsed = measure_time do
    # your time-consuming task here:
    sleep 2.2321
end

=> 2.232

3

প্রথম সময়টি বিয়োগ করার চেষ্টা করুন now তাই ভালো:

a = Time.now
sleep(3)
puts Time.now - a # about 3.0

এটি আপনাকে দুই বারের মধ্যে সেকেন্ডের ভাসমান-পয়েন্ট নম্বর দেয় (এবং এটির সাথে মিলি সেকেন্ডও)।

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