आप रूबी में डेटाइम और टाइम ऑब्जेक्ट के बीच कैसे परिवर्तित होते हैं?
आप रूबी में डेटाइम और टाइम ऑब्जेक्ट के बीच कैसे परिवर्तित होते हैं?
जवाबों:
आपको दो अलग-अलग रूपांतरणों की आवश्यकता होगी।
आप से बदलने के Time
लिए DateTime
निम्नानुसार समय वर्ग में संशोधन कर सकते हैं:
require 'date'
class Time
def to_datetime
# Convert seconds + microseconds into a fractional number of seconds
seconds = sec + Rational(usec, 10**6)
# Convert a UTC offset measured in minutes to one measured in a
# fraction of a day.
offset = Rational(utc_offset, 60 * 60 * 24)
DateTime.new(year, month, day, hour, min, seconds, offset)
end
end
दिनांक के समान समायोजन आपको परिवर्तित DateTime
करने देगा Time
।
class Date
def to_gm_time
to_time(new_offset, :gm)
end
def to_local_time
to_time(new_offset(DateTime.now.offset-offset), :local)
end
private
def to_time(dest, method)
#Convert a fraction of a day to a number of microseconds
usec = (dest.sec_fraction * 60 * 60 * 24 * (10**6)).to_i
Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min,
dest.sec, usec)
end
end
ध्यान दें कि आपको स्थानीय समय और जीएम / यूटीसी समय के बीच चयन करना है।
उपरोक्त दोनों कोड स्निपेट ओ'रेली के रूबी कुकबुक से लिए गए हैं । उनकी कोड पुन: उपयोग नीति इसकी अनुमति देती है।
require 'time'
require 'date'
t = Time.now
d = DateTime.now
dd = DateTime.parse(t.to_s)
tt = Time.parse(d.to_s)
रूबी पारिस्थितिकी तंत्र की स्थिति के लिए एक अद्यतन के रूप में Date
, DateTime
और Time
अब विभिन्न वर्गों के बीच कनवर्ट करने के लिए तरीके हैं। रूबी का उपयोग 1.9.2+:
pry
[1] pry(main)> ts = 'Jan 1, 2000 12:01:01'
=> "Jan 1, 2000 12:01:01"
[2] pry(main)> require 'time'
=> true
[3] pry(main)> require 'date'
=> true
[4] pry(main)> ds = Date.parse(ts)
=> #<Date: 2000-01-01 (4903089/2,0,2299161)>
[5] pry(main)> ds.to_date
=> #<Date: 2000-01-01 (4903089/2,0,2299161)>
[6] pry(main)> ds.to_datetime
=> #<DateTime: 2000-01-01T00:00:00+00:00 (4903089/2,0,2299161)>
[7] pry(main)> ds.to_time
=> 2000-01-01 00:00:00 -0700
[8] pry(main)> ds.to_time.class
=> Time
[9] pry(main)> ds.to_datetime.class
=> DateTime
[10] pry(main)> ts = Time.parse(ts)
=> 2000-01-01 12:01:01 -0700
[11] pry(main)> ts.class
=> Time
[12] pry(main)> ts.to_date
=> #<Date: 2000-01-01 (4903089/2,0,2299161)>
[13] pry(main)> ts.to_date.class
=> Date
[14] pry(main)> ts.to_datetime
=> #<DateTime: 2000-01-01T12:01:01-07:00 (211813513261/86400,-7/24,2299161)>
[15] pry(main)> ts.to_datetime.class
=> DateTime
1.9.3p327 :007 > ts = '2000-01-01 12:01:01 -0700' => "2000-01-01 12:01:01 -0700" 1.9.3p327 :009 > dt = ts.to_datetime => Sat, 01 Jan 2000 12:01:01 -0700 1.9.3p327 :010 > dt.to_time => Sat, 01 Jan 2000 12:01:01 -0700 1.9.3p327 :011 > dt.to_time.class => DateTime
दुर्भाग्य से, DateTime.to_time, Time.to_datetime
और Time.parse
फ़ंक्शन टाइमज़ोन जानकारी को बनाए नहीं रखते हैं। रूपांतरण के दौरान सब कुछ स्थानीय समयक्षेत्र में बदल जाता है। तिथि अंकगणित अभी भी काम करते हैं, लेकिन आप उनके मूल टाइमज़ोन के साथ दिनांक प्रदर्शित नहीं कर पाएंगे। वह संदर्भ जानकारी अक्सर महत्वपूर्ण होती है। उदाहरण के लिए, यदि मैं न्यूयॉर्क में व्यावसायिक घंटों के दौरान किए गए लेन-देन को देखना चाहता हूं, तो शायद मैं उन्हें अपने मूल टाइमज़ोन में प्रदर्शित करना पसंद करता हूं, न कि ऑस्ट्रेलिया में मेरे स्थानीय समयक्षेत्र (जो कि न्यूयॉर्क से 12 घंटे आगे है) में।
नीचे दिए गए रूपांतरण तरीके उस tz जानकारी को रखते हैं।
रूबी 1.8 के लिए, गॉर्डन विल्सन के जवाब को देखें । यह अच्छे पुराने विश्वसनीय रूबी कुकबुक से है।
रूबी 1.9 के लिए, यह थोड़ा आसान है।
require 'date'
# Create a date in some foreign time zone (middle of the Atlantic)
d = DateTime.new(2010,01,01, 10,00,00, Rational(-2, 24))
puts d
# Convert DateTime to Time, keeping the original timezone
t = Time.new(d.year, d.month, d.day, d.hour, d.min, d.sec, d.zone)
puts t
# Convert Time to DateTime, keeping the original timezone
d = DateTime.new(t.year, t.month, t.day, t.hour, t.min, t.sec, Rational(t.gmt_offset / 3600, 24))
puts d
यह निम्नलिखित प्रिंट करता है
2010-01-01T10:00:00-02:00
2010-01-01 10:00:00 -0200
2010-01-01T10:00:00-02:00
Timezone सहित पूरी मूल DateTime जानकारी रखी गई है।
Time#to_datetime
मेरे लिए tz को संरक्षित करता है:Time.local(0).to_datetime.zone #=> "-07:00"; Time.gm(0).to_datetime.zone #=> "+00:00"
गॉर्डन विल्सन समाधान में सुधार, यहाँ मेरी कोशिश है:
def to_time
#Convert a fraction of a day to a number of microseconds
usec = (sec_fraction * 60 * 60 * 24 * (10**6)).to_i
t = Time.gm(year, month, day, hour, min, sec, usec)
t - offset.abs.div(SECONDS_IN_DAY)
end
आपको UTC में एक ही समय मिलेगा, टाइमज़ोन खोने (दुर्भाग्य से)
इसके अलावा, यदि आपके पास माणिक 1.9 है, तो बस to_time
विधि का प्रयास करें