রুবিতে 13-সংখ্যার পূর্ণসংখ্যা হিসাবে কীভাবে বর্তমান সময় পাবেন?


88

আমার এই jQueryফাংশনটি রয়েছে যা যুগের আগে থেকে মিলি সেকেন্ডের সংখ্যা হিসাবে বর্তমান সময়কে ফেরত দেয় (জানুয়ারী 1, 1970):

time = new Date().getTime();

রুবিতেও কি একইভাবে করার উপায় আছে?

এখনই, আমি রুবি ব্যবহার করছি Time.now.to_iযা দুর্দান্ত কাজ করে তবে 10-সংখ্যার পূর্ণসংখ্যার (সেকেন্ডের সংখ্যা) দেয়

আমি কীভাবে এটি মিলিসেকেন্ডের সংখ্যাটি প্রদর্শন করতে পারি jQuery?


4
এটি কোনও "jQuery ফাংশন" নয়, এটি কেবল সাধারণ ECMAScript (জাভাস্ক্রিপ্ট)। সম্ভবত এটিই -1 উত্সাহিত করেছে, যদিও কিছুটা কঠোর।
রবজি

উত্তর:


155
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)

31
রেল ব্যবহারকারীদের জন্য দ্রষ্টব্য: strftimeসরবরাহিত পদ্ধতিতে এবং নির্দিষ্টকারীদের ActiveSupport::TimeWithZoneঅন্তর্ভুক্ত করা হয় না । পদ্ধতিটি ব্যবহার করে আপনাকে প্রথমে একটি সরল রুবিতে রূপান্তর করতে হবে । %s%QDateTimeto_datetime
লোনন ফস্টার

6
@ লোননফোস্টার এখন এটি কাজ করে (কেবলমাত্র রেল কনসোলে পরীক্ষিত)।
নিকোলা স্টোজাকোভিć

হাই, আমি এখনকার জন্য না, বরং তারিখের ক্ষেত্র থেকে কীভাবে একই জিনিস করতে পারি?
টোমর

এটি এখানে পাওয়া গেছে: stackoverflow.com/questions/24149463/ruby-strftimeq-broken
টোমর

মনে রাখবেন যে গোল করার চেয়ে এটি কেটে ফেলেছে (যেমন আপনি উদাহরণ থেকে দেখতে পাচ্ছেন - 1384526946523ms 1384526947 এর মধ্যে হওয়া উচিত)।
ডেভিড মোলস

102

gettime()যুগের আগে থেকেই জাভাস্ক্রিপ্টের মিলিসেকেন্ডের সংখ্যা ফিরে আসে।

প্রথম Time.now.to_iযুগের পর থেকে রুবি আপনাকে সেকেন্ডের সংখ্যা দেবে। আপনি যদি এটিতে পরিবর্তন করেন Time.now.to_fতবে আপনি এখনও সেকেন্ড পান তবে ভগ্নাংশের উপাদান সহ। কেবল এটি 1000 দিয়ে গুণ করুন এবং আপনার কাছে মিলি সেকেন্ড রয়েছে। তারপরে #to_iএটি একটি পূর্ণসংখ্যায় রূপান্তর করতে ব্যবহার করুন । এবং আপনি এখানে দিয়ে শেষ:

(Time.now.to_f * 1000).to_i

ব্যাখ্যার জন্য অনেক ধন্যবাদ! এখনও এই পুরোপুরি নতুন বিষয় ... জানেন না কোন উত্তরটি আসলে সঠিক হিসাবে চিহ্নিত হবে ...
Tintin81

4
কেবলমাত্র আরও তথ্যের জন্য, Time.nowরুবেল থেকে Time.currentআসে যখন থেকে রেল আসে। সুতরাং Time.currentরেল অ্যাপ্লিকেশন টাইমজোন দ্বারা স্বীকৃত এবং Time.nowসার্ভার টাইমজোন ব্যবহার করছে। আমার অভিজ্ঞতা, সবসময় ব্যবহার Time.currentটাইমজোন দৃঢ়তা জন্য আপনার পাগল আবেদনের
vutran

4
না, আপনার Time.currentএখানে মোটেও ব্যবহার করা উচিত নয় , এটি নির্মাণে আরও বেশি সময় লাগে এবং যেহেতু আপনি এটি অবিলম্বে একটি ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করছেন তাই আপনার সময় অঞ্চলগুলির সামঞ্জস্যতা মোটেই যত্ন নেই। (ইউনিক্সের টাইমস্ট্যাম্পগুলি সর্বদা ইউটিসির সাথে সম্পর্কিত)। সুতরাং, আপনি যেটি বলছেন তা 99% ক্ষেত্রে সত্য, যদিও এটি একটি কর্মক্ষমতা অনুযায়ী সর্বশেষ 1% এর মধ্যে পড়ে।
পেলমিস্টার

4
এটি আমার পছন্দসই পদ্ধতি। আমি করতে চাই একটি :epochপদ্ধতি যোগ করার জন্য টাইম ক্লাসকে বাড়িয়ে তোলা: ক্লাস টাইম ডিএফ ইপোচ (স্ব। টো_ফ * 1000)। টু আই শেষ
ম্যাট ওয়েল্কে

@ ব্রুলিওবো কীভাবে এটি মিলি সেকেন্ডে ভুগছে সে বিষয়ে বিস্তারিত জানার জন্য যত্নশীল? আপনার বক্তব্য বিভ্রান্তিকর, অপের উত্তর একেবারেই সঠিক।
coisnepe

31

(Time.now.to_f * 1000).to_i একই জিনিস করা উচিত।


4
@ ব্রাউলিও জাল মিলিসেকেন্ড কী?
এরিক রোথফ

4
to_fদশমিক হিসাবে মিলিসেকেন্ড অন্তর্ভুক্ত করা হয় , কারণ এটি ব্রাবিলোবো না doesn't
CashIsClay

21

ব্যবহার করে strftime, আপনি সেকেন্ডের সংখ্যা পেতে পারেন এবং ভগ্নাংশ মিলিসেকেন্ডগুলি যুক্ত করতে পারেন (বা আরও ছোট ইউনিট, প্রয়োজন হলে):

2.2.2 :001 > t = Time.new
 => 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N')
 => "1433272616888" 

নোট করুন যদিও এটি গোলাকার নয়, এটি কেটে যায়, আপনি দেখতে পাচ্ছেন to_fবা মাইক্রোসেকেন্ডে বেরিয়ে গেলে:

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 

এবং to_f/ to_iসমাধানের একই সমস্যা রয়েছে:

2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888

তাই যদি আপনি সত্যিই মিলিসেকেন্ডে সঠিকতা যত্নশীল, একটি ভাল বাজি হতে পারে to_fসঙ্গে round:

2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889

এটি বলেছিল যে ডক্সগুলিতে উল্লিখিত হয়েছে , "আইপিইই 75৫৪ ডাবলটি যুগের পর থেকে ন্যানোসেকেন্ডের সংখ্যা উপস্থাপনের পক্ষে যথেষ্ট সঠিক নয়", তাই যদি আপনি সত্যিই যত্নবান হন তবে to_rপরিবর্তে বিবেচনা করুন to_f-

2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889 

- যদিও আপনি যদি কেবল মিলি সেকেন্ডে গোল করেন তবে আপনি সম্ভবত ভাল আছেন।


18

সাবধান, বিভ্রান্ত না হয়। ভাসা হিসাবে ভ্রূক্ষেপগত সেকেন্ডের ধারণাকে রুবি সমর্থন করে তা আসলে এটি একটি ভাসমান পয়েন্ট সংখ্যা করে না। পাইথনে যখন ওয়্যারশার্ক টাইমস্ট্যাম্প সময় তুলনা করছিলাম তখন আমি এই সমস্যায় পড়েছিলাম ... পিসিপ-এনজি-তে সময় গণনা ঠিক কাজ করছিল না। উভয় পূর্ণসংখ্যা হিসাবে আমি যথাযথ সংখ্যা পেতে সক্ষম হওয়ায় আমি কেবল তখনই দুটি অংশ (অবিচ্ছেদ্য সেকেন্ড এবং ইন্টিগ্রাল ন্যানোসেকেন্ডস) চিকিত্সা করি।

এটি কারণ ভাসমান পয়েন্ট সংখ্যাগুলির যথাযথ সমস্যা রয়েছে । প্রকৃতপক্ষে, রুবি একটি দ্রুত বিট আপনাকে দেখায় যে to_f সমান হয় না, বলুন, এনএসসি:

irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844

ক্যাভেট প্রোগ্রামার। আপনি 3 টি উল্লেখযোগ্য সংখ্যায় নিরাপদ থাকতে পারেন, তবে সত্যটি রয়ে গেছে: কম্পিউটারে ভাসমান পয়েন্ট সংখ্যাগুলি আনুমানিক। আধুনিক কম্পিউটারে ন্যানোসেকেন্ড কাউন্টারগুলি হল পূর্ণসংখ্যা।


আরও ভাল সাড়া। ধন্যবাদ. নির্দেশিকা বিন্যাসটিও .strftime("%9N")ব্যবহার করা যেতে পারে। রুবি
ডোক.আর.অর্গ.আওকোর

13

একটি পান টাইম সঙ্গে বস্তুর Time.now, কলিং #to_iরিটার্ন একটি ইউনিক্স টাইমস্ট্যাম্প (সময় পর্ব থেকে কয়েক সেকেন্ডের)। #to_fভগ্নাংশের সেকেন্ড দেয় যা আপনি পর্ব থেকে মিলিসেকেন্ডগুলি পেতে ব্যবহার করতে পারেন:

Time.now.to_f * 1000


@ ব্রাবলিও কীভাবে এই "জাল মিলিসেকেন্ড"? আপনি কোডটি কার্যকর করতে এবং নিজের জন্য যাচাই করার জন্য সময় নিয়েছিলেন?
coisnepe

0

টাইপকাস্ট পূর্ণসংখ্যা (1e6 * সময়.নো. টো_ফ) একটি বিগনাম দেয় যা মিলিসেকেন্ডগুলি ধরে রাখতে পারে

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