উত্তর:
DateTime.strptimeযুগের পর থেকে কয়েক সেকেন্ড পরিচালনা করতে পারে। সংখ্যাটি স্ট্রিংয়ে রূপান্তর করতে হবে:
require 'date'
DateTime.strptime("1318996912",'%s')
%Q।
Timeহচ্ছে পরিবর্তে এটি প্রয়োজনীয় DateTime। সুতরাং ব্যবহার করুন Time.strptime("1318996912345",'%Q').to_fএবং আপনি মিলিসেকেন্ডগুলি সংরক্ষণিত দেখতে পাবেন, যখন DateTime.strptime("1318996912345",'%Q').to_fএটি সংরক্ষণ করা হয় না।
দুঃখিত, সংক্ষেপে ব্যর্থতার সংক্ষিপ্ত মুহূর্ত। আসল উত্তর এখানে।
require 'date'
Time.at(seconds_since_epoch_integer).to_datetime
সংক্ষিপ্ত উদাহরণ (এটি বর্তমান সিস্টেমের সময় অঞ্চল বিবেচনা করে):
$ date +%s
1318996912
$ irb
ruby-1.9.2-p180 :001 > require 'date'
=> true
ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
=> #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)>
আরও আপডেট (ইউটিসির জন্য):
ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
=> #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>
সাম্প্রতিক আপডেট : আমি এই থ্রেডের শীর্ষ সমাধানগুলি এক সপ্তাহ বা দু'বছর আগে এইচএ পরিষেবাতে কাজ করার সময় বেঞ্চমার্ক করেছিলাম এবং অবাক হয়ে Time.at(..)গিয়েছি DateTime.strptime(..)(আপডেট: আরও মানদণ্ড যুক্ত) find
# ~ % ruby -v
# => ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]
irb(main):038:0> Benchmark.measure do
irb(main):039:1* ["1318996912", "1318496912"].each do |s|
irb(main):040:2* DateTime.strptime(s, '%s')
irb(main):041:2> end
irb(main):042:1> end
=> #<Benchmark ... @real=2.9e-05 ... @total=0.0>
irb(main):044:0> Benchmark.measure do
irb(main):045:1> [1318996912, 1318496912].each do |i|
irb(main):046:2> DateTime.strptime(i.to_s, '%s')
irb(main):047:2> end
irb(main):048:1> end
=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>
irb(main):050:0* Benchmark.measure do
irb(main):051:1* ["1318996912", "1318496912"].each do |s|
irb(main):052:2* Time.at(s.to_i).to_datetime
irb(main):053:2> end
irb(main):054:1> end
=> #<Benchmark ... @real=1.5e-05 ... @total=0.0>
irb(main):056:0* Benchmark.measure do
irb(main):057:1* [1318996912, 1318496912].each do |i|
irb(main):058:2* Time.at(i).to_datetime
irb(main):059:2> end
irb(main):060:1> end
=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>
Time.atতূলনায় DateTime.strptime। পরেরটির একটি স্ট্রিং পার্স করতে হয় যা সাধারণত কোনও সংখ্যায় সরাসরি নেওয়ার চেয়ে ধীর হয়।
DateTime.strptimeকারণ এটি প্রতিটি পুনরাবৃত্তির জন্য দুটি নতুন স্ট্রিং তৈরি করে যা খুব ব্যয়বহুল। এটি কেবল স্ট্রিংকে পার্সিংয়ের মতো নয় যেমন @ ক্লাও বলেছিলেন
সময় অঞ্চল পরিচালনা
আমি কেবল স্পষ্ট করতে চাই, যদিও এটি মন্তব্য করা হয়েছে যাতে ভবিষ্যতের লোকেরা এই অত্যন্ত গুরুত্বপূর্ণ পার্থক্যটি মিস করবেন না।
DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000
ইউটিসিতে একটি রিটার্ন মান প্রদর্শন করে এবং একটি স্ট্রিং হতে সেকেন্ডের প্রয়োজন হয় এবং একটি ইউটিসি টাইম অবজেক্টকে আউটপুট দেয়, অন্যদিকে
Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
LOCAL টাইম জোনে একটি রিটার্ন মান প্রদর্শন করে, সাধারণত একটি ফিক্সনাম আর্গুমেন্টের প্রয়োজন হয়, তবে টাইম অবজেক্ট নিজেই এখনও ইউটিসিতে থাকে যদিও প্রদর্শনটি হয় নি।
সুতরাং যদিও আমি উভয় পদ্ধতির সাথে একই পূর্ণসংখ্যার পাস করেছি, ক্লাসের ' #to_sপদ্ধতিটি কীভাবে কাজ করে তা দেখে মনে হচ্ছে দুটি ভিন্ন ফলাফল । যাইহোক, @ এরো হিসাবে আমাকে দু'বার মনে করিয়ে দিতে হয়েছিল:
Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true
দুটি রিটার্ন মানের মধ্যে একটি সমতা তুলনা এখনও সত্য ফিরে আসে। আবার এটির কারণ হ'ল মানগুলি মূলত একই (যদিও বিভিন্ন শ্রেণি, #==পদ্ধতিটি এটি আপনার জন্য যত্ন নেয়), তবে #to_sপদ্ধতিটি বিভিন্ন স্ট্রিংগুলি প্রিন্ট করে। যদিও, আমরা যদি স্ট্রিংগুলিতে লক্ষ্য করি তবে আমরা দেখতে পাচ্ছি যে সেগুলি একই সময়ে, কেবলমাত্র বিভিন্ন টাইম জোনে মুদ্রিত।
পদ্ধতি আর্গুমেন্ট স্পষ্টকরণ
দস্তাবেজগুলি আরও বলে যে "যদি একটি সংখ্যার যুক্তি দেওয়া হয়, তবে ফলাফল স্থানীয় সময়ে হয়।" যা বোঝা যায়, তবে আমার কাছে কিছুটা বিভ্রান্তি হয়েছিল কারণ তারা ডক্সে কোনও পূর্ণসংখ্যার যুক্তির কোনও উদাহরণ দেয় না। সুতরাং, কিছু অ-পূর্ণসংখ্যার যুক্তির উদাহরণগুলির জন্য:
Time.at("1318996912")
TypeError: can't convert String into an exact number
আপনি কোনও স্ট্রিং আর্গুমেন্ট ব্যবহার করতে পারবেন না তবে আপনি একটি সময় আর্গুমেন্টটি ব্যবহার করতে পারেন Time.atএবং এটি আর্গুমেন্টের সময় অঞ্চলে ফলাফলটি ফিরিয়ে দেবে:
Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900
benchmarks
তার উত্তরে @ অ্যাডাম এবারলিনের সাথে আলোচনার পরে, আমি যতটা সম্ভব সমান করার জন্য কিছুটা পরিবর্তিত বেঞ্চমার্ক প্রকাশ করার সিদ্ধান্ত নিয়েছি। এছাড়াও, আমি কখনই এগুলি আবার তৈরি করতে চাই না যাতে এগুলি সংরক্ষণের জন্য এটি যতটা ভাল জায়গা।
সময়.এট (ইনট্রি)। টু ডেটটাইম ~ 2.8x দ্রুত
09:10:58-watsw018:~$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
09:11:00-watsw018:~$ irb
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> require 'date'
=> true
irb(main):003:0>
irb(main):004:0* format = '%s'
=> "%s"
irb(main):005:0> times = ['1318996912', '1318496913']
=> ["1318996912", "1318496913"]
irb(main):006:0> int_times = times.map(&:to_i)
=> [1318996912, 1318496913]
irb(main):007:0>
irb(main):008:0* datetime_from_strptime = DateTime.strptime(times.first, format)
=> #<DateTime: 2011-10-19T04:01:52+00:00 ((2455854j,14512s,0n),+0s,2299161j)>
irb(main):009:0> datetime_from_time = Time.at(int_times.first).to_datetime
=> #<DateTime: 2011-10-19T00:01:52-04:00 ((2455854j,14512s,0n),-14400s,2299161j)>
irb(main):010:0>
irb(main):011:0* datetime_from_strptime === datetime_from_time
=> true
irb(main):012:0>
irb(main):013:0* Benchmark.measure do
irb(main):014:1* 100_000.times {
irb(main):015:2* times.each do |i|
irb(main):016:3* DateTime.strptime(i, format)
irb(main):017:3> end
irb(main):018:2> }
irb(main):019:1> end
=> #<Benchmark::Tms:0x00007fbdc18f0d28 @label="", @real=0.8680500000045868, @cstime=0.0, @cutime=0.0, @stime=0.009999999999999998, @utime=0.86, @total=0.87>
irb(main):020:0>
irb(main):021:0* Benchmark.measure do
irb(main):022:1* 100_000.times {
irb(main):023:2* int_times.each do |i|
irb(main):024:3* Time.at(i).to_datetime
irb(main):025:3> end
irb(main):026:2> }
irb(main):027:1> end
=> #<Benchmark::Tms:0x00007fbdc3108be0 @label="", @real=0.33059399999910966, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.32000000000000006, @total=0.32000000000000006>
**** প্রতিটি উপায়ে সম্পূর্ণ এবং সম্পূর্ণ ভুল না হওয়ার জন্য সম্পাদিত ****
**** যোগ করা মানদণ্ড ****
Time.at(1318996912) == DateTime.strptime("1318996912",'%s')একটি অ-ইউটিসি সময় অঞ্চল এবং আপনাকে দেখতেই হবে!
Time.use_zone "Samoa" do Time.at(1318996912) == DateTime.strptime("1318996912",'%s') endসময় সমান কিনা তা যাচাই করতে দৌড়াও, কোনও স্থানীয় টাইমস্ট্যাম্প নেই এবং উভয় ক্ষেত্রেই ইউনিক্স টাইমস্ট্যাম্পটি ইউটিসি-তে রয়েছে বলে ব্যাখ্যা করা হয়। Time.at উপহার স্থানীয় সময় অঞ্চল ফলে টাইম বস্তু, এবং DateTime.strptime উপহার ইউটিসি ফলে তারিখসময় বস্তু, কিন্তু উপস্থাপনা নির্বিশেষে তারা সমান, তারা সময় সমতুল্য মুহূর্ত আছে।
Time.at(1318996912) # => 2011-10-19 00:01:52 -0400LOCAL টাইম জোনে একটি রিটার্ন মান প্রদর্শন করে তা সঠিক বলে মনে হচ্ছে না ... আপনি দয়া করে যাচাই করতে পারবেন? আমি বিশ্বাস করি আপনার বক্তব্যটি কেবলমাত্র যদি আপনি ব্যবহার করেন তবে সত্য হবেTime.zone.at(1318996912)
তারিখের সময়টিকে ইউনিক্স ফর্ম্যাটে এবং তারপরে স্ট্রিংয়ে রূপান্তর করতে একটি কমান্ড
DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")
Time.now.utc.to_i #Converts time from Unix format
DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime
অবশেষে স্ট্রফটাইম তারিখের ফর্ম্যাট করতে ব্যবহৃত হয়
উদাহরণ:
irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
"10 09 14"
Time.now.utc.to_i।
আপনি কোডটি কার্যকর করার মুহুর্ত থেকে এটি আপনাকে ভবিষ্যতে সেকেন্ডের সংখ্যার তারিখ বলে দেয়।
time = Time.new + 1000000000 #date in 1 billion seconds
রাখে (সময়)
বর্তমান সময়ের অনুযায়ী আমি মুদ্রিত প্রশ্নের উত্তর দিচ্ছি 047-05-14 05:16:16 +0000(ভবিষ্যতে 1 বিলিয়ন সেকেন্ড)
বা যদি আপনি কোনও নির্দিষ্ট সময় থেকে বিলিয়ন সেকেন্ড গণনা করতে চান তবে এটি ফর্ম্যাটে Time.mktime(year, month,date,hours,minutes)
time = Time.mktime(1987,8,18,6,45) + 1000000000
পুটস ("আমার বয়স 1 বিলিয়ন সেকেন্ড হবে:" + সময়)