কিভাবে ইউনিক্স টাইমস্ট্যাম্প (যুগের পর থেকে সেকেন্ড) রুবি ডেটটাইমে রূপান্তর করবেন?


369

আপনি কীভাবে একটি ইউনিক্স টাইমস্ট্যাম্প (যুগের পর থেকে সেকেন্ড) রুবি ডেটটাইমে রূপান্তর করবেন?

উত্তর:


354

DateTime.strptimeযুগের পর থেকে কয়েক সেকেন্ড পরিচালনা করতে পারে। সংখ্যাটি স্ট্রিংয়ে রূপান্তর করতে হবে:

require 'date'
DateTime.strptime("1318996912",'%s')

4
এটি ভগ্নাংশের সেকেন্ডগুলি পরিচালনা করে না
ড্যান স্যান্ডবার্গ

45
এটি 'থো'র সাথে মিলিসেকেন্ডগুলি পরিচালনা করে %Q
মিনি জন

3
@ দ্যমিনিজহান এর উত্তর অনুসরণ করতে। দেখে মনে Timeহচ্ছে পরিবর্তে এটি প্রয়োজনীয় DateTime। সুতরাং ব্যবহার করুন Time.strptime("1318996912345",'%Q').to_fএবং আপনি মিলিসেকেন্ডগুলি সংরক্ষণিত দেখতে পাবেন, যখন DateTime.strptime("1318996912345",'%Q').to_fএটি সংরক্ষণ করা হয় না।
skensell

625

দুঃখিত, সংক্ষেপে ব্যর্থতার সংক্ষিপ্ত মুহূর্ত। আসল উত্তর এখানে।

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>

1
আপনাকে ধন্যবাদ ... নিম্নলিখিত উত্তরটি আরও কিছুটা সংক্ষিপ্ত, আমি টাইম.ট খুঁজে পেয়েছি কিন্তু ডেটটাইম সমতুল্য অনুসন্ধান করার চেষ্টা করছিলাম।
ট্রোননাথন

27
এটি মজাদার তবে টাইম.ট ()। টু ডেটটাইম ডেটটাইম.স্ট্রিপটাইম () থেকে কেবল পাঠযোগ্যতার কারণে বেশি সুখকর মনে হচ্ছে ... কমপক্ষে আমার কাছে যাইহোক
tybro0103

34
এটি উপরের আনসারের মতো নয়, টাইম.ট বর্তমান টাইমজোন ধরে নেয়, যেখানে ডেটটাইম.স্ট্রিপটাইম ইউটিসি ব্যবহার করে।
ভিটালি বাবি

5
এটা খুবই যে বিস্ময়কর নয় Time.atতূলনায় DateTime.strptime। পরেরটির একটি স্ট্রিং পার্স করতে হয় যা সাধারণত কোনও সংখ্যায় সরাসরি নেওয়ার চেয়ে ধীর হয়।
নখ

2
আপনার মানদণ্ডটি হুবহু পরীক্ষা নিচ্ছে না DateTime.strptimeকারণ এটি প্রতিটি পুনরাবৃত্তির জন্য দুটি নতুন স্ট্রিং তৈরি করে যা খুব ব্যয়বহুল। এটি কেবল স্ট্রিংকে পার্সিংয়ের মতো নয় যেমন @ ক্লাও বলেছিলেন
ওয়াটসইনাবক্স

67

সময় অঞ্চল পরিচালনা

আমি কেবল স্পষ্ট করতে চাই, যদিও এটি মন্তব্য করা হয়েছে যাতে ভবিষ্যতের লোকেরা এই অত্যন্ত গুরুত্বপূর্ণ পার্থক্যটি মিস করবেন না।

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>

**** প্রতিটি উপায়ে সম্পূর্ণ এবং সম্পূর্ণ ভুল না হওয়ার জন্য সম্পাদিত ****

**** যোগ করা মানদণ্ড ****


3
কলুষিতকর বলে মনে হয়েছিল এবং আমি ইতিমধ্যে upvmitted (এখন উদ্ধার করতে পারি না), তবে ইউটিসি সম্পর্কিত আপনার দাবির সত্যতা যাচাইয়ের পরে এটি অসত্য। ফলাফলের ডেটটাইম / টাইম অবজেক্টটি ইউটিসি বনাম স্থানীয় হবে, হ্যাঁ, তবে মূল টাইমস্ট্যাম্পটি উভয় ক্ষেত্রেই ইউটিসি-তে রয়েছে বলে ব্যাখ্যা করা হয়! সুতরাং সময় মুহুর্ত পদ্ধতি নির্বিশেষে সমান। ব্যবহার করে দেখুন Time.at(1318996912) == DateTime.strptime("1318996912",'%s')একটি অ-ইউটিসি সময় অঞ্চল এবং আপনাকে দেখতেই হবে!
ইয়েরো

4
আমি দুঃখিত, তবে আপনি যা সংশোধন করেছেন তা এখনও ভুল! :-) 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)
BigRon

হ্যাঁ, এটি সঠিক বলে মনে হচ্ছে। আমার স্থানীয় মেশিনটি EST এ সেট করা হয়েছে এবং সময় EST এ প্রদর্শিত হবে।
ওয়াটসআইনাবক্স 11:58

আপনি কি একটি উদাহরণ প্রদান করতে পারেন যেখানে এটি @ বিগ্রন নয়? কোন টাইম জোন, রুবি সংস্করণ ইত্যাদি এ জাতীয় আচরণ করে না?
ওয়াটসআইনাবক্স

10

তারিখের সময়টিকে ইউনিক্স ফর্ম্যাটে এবং তারপরে স্ট্রিংয়ে রূপান্তর করতে একটি কমান্ড

    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"

একটি বিষয় লক্ষণীয় যে, যুগের বিন্যাসে টাইমজোন নেই তাই to_i শৃঙ্খলার পূর্বে ইউটিসি চেইন করা আবশ্যক নয় Time.now.utc.to_i
ট্রেভর ম্যাকক্যাসল্যান্ড

1

আপনি কোডটি কার্যকর করার মুহুর্ত থেকে এটি আপনাকে ভবিষ্যতে সেকেন্ডের সংখ্যার তারিখ বলে দেয়।

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 বিলিয়ন সেকেন্ড হবে:" + সময়)


0

আপনি যদি কেবল একটি তারিখ চেয়েছিলেন, আপনি Date.strptime(invoice.date.to_s, '%s')যেখানে invoice.dateআকারে আসে সেখানে করতে পারেন Fixnumএবং তারপরে একটিতে রূপান্তর করতে পারেন String


3
Time.at(1500923406).to_date.to_s=>"2017-07-24"
ক্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.