मैं Ruby में DateTC.now को UTC में कैसे परिवर्तित करूँ?


97

यदि मेरे पास है d = DateTime.now, तो मैं 'd' को UTC (उपयुक्त तिथि के साथ) में कैसे परिवर्तित करूँ?

जवाबों:


155

d = DateTime.now.utc

ऊप्स!

यह रेल में काम करने लगता है, लेकिन वेनिला रूबी (और निश्चित रूप से वही है जो सवाल पूछ रही है)

d = Time.now.utc

हालांकि काम करता है।

क्या कोई कारण है जिसका आपको उपयोग करने की आवश्यकता है DateTimeऔर नहीं Time? Timeआप की जरूरत है सब कुछ शामिल करना चाहिए:

irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009

क्योंकि मैं रूपांतरण के लिए सही तारीख चाहता हूं, यानी GMT +10 के लिए अगले दिन आगे हो सकता है ...
Ash

2
आपके लिए समय ठीक रहेगा। समय में तारीख का हिस्सा भी शामिल है, न कि दिन का समय। एक नज़र लेने के लिए Time.now.inspect करें।
दानसिंघरमैन

2
ओह, बहुत अच्छे। तो Date, Time और DateTime के बीच अंतर क्या है?
ऐश

18
1 जनवरी, 1970 00:00 यूटीसी के बाद से समय आंतरिक रूप से सेकंड और माइक्रोसेकंड की संख्या के रूप में संग्रहीत किया जाता है। दिनांक, आंतरिक रूप से, एक खगोलीय जूलियन दिवस संख्या के रूप में दर्शाया गया है, और दिनांक समय केवल सादा अजीब है (शायद यही वजह है कि रेल इसे ओवरराइड करती है)
DanSingerman

169
DateTime.now.new_offset(0)

रूबी में काम करेगा (यानी ActiveSupport के बिना)।


3
और यह वास्तव में प्रश्न का सबसे सही उत्तर है।
अर्नेस्ट

2
यह अधिक upvotes होना चाहिए। डेटटाइम टाइम के लिए अलग है। मुझे इसकी बिल्कुल जरूरत थी।
d11wtq

1
new_offsetविधि तर्क 0पहले से ही डिफॉल्ट करता है । तो DateTime.now.new_offsetभी इस्तेमाल किया जा सकता है।
क्रिप्टोकरंसी

8

दुर्भाग्य से, डेटटाइम क्लास के पास ऐसा करने के लिए समय वर्ग में सुविधा के तरीके उपलब्ध नहीं हैं। आप किसी भी DateTime वस्तु को UTC में इस तरह परिवर्तित कर सकते हैं:

d = DateTime.now
d.new_offset(Rational(0, 24))

आप UTC से स्थानीय समय के बाद वापस स्विच कर सकते हैं:

d.new_offset(DateTime.now.offset)

dUTC समय में दिनांक समय ऑब्जेक्ट कहाँ है। यदि आप इन्हें सुविधा विधियों के रूप में पसंद करते हैं, तो आप इन्हें इस तरह बना सकते हैं:

class DateTime
  def localtime
    new_offset(DateTime.now.offset)
  end

  def utc
    new_offset(Rational(0, 24))
  end
end

आप इसे निम्नलिखित irb सत्र में कार्रवाई में देख सकते हैं:

d = DateTime.now.new_offset(Rational(-4, 24))
 => #<DateTime: 106105391484260677/43200000000,-1/6,2299161> 
1.8.7 :185 > d.to_s
 => "2012-08-03T15:42:48-04:00" 
1.8.7 :186 > d.localtime.to_s
 => "2012-08-03T12:42:48-07:00" 
1.8.7 :187 > d.utc.to_s
 => "2012-08-03T19:42:48+00:00" 

जैसा कि आप ऊपर देख सकते हैं, प्रारंभिक DateTime ऑब्जेक्ट में -04: 00 ऑफसेट (पूर्वी समय) है। मैं -07: 00 ऑफसेट के साथ प्रशांत समय में हूं। कॉलिंग localtimeजैसा कि पहले ठीक से वर्णित स्थानीय समय में दिनांक समय वस्तु बदल देता है। utcऑब्जेक्ट पर कॉल करना ठीक से इसे यूटीसी ऑफसेट में कनवर्ट करता है।


5

यह कोशिश करो, रूबी में काम करता है in

DateTime.now.to_time.utc

4

यदि आप चाहते हैं Time.nowऔर DateTime.nowयूटीसी समय में जवाब देने के लिए आप एक ईएनवी सेट कर सकते हैं ।

require 'date'
Time.now #=> 2015-11-30 11:37:14 -0800
DateTime.now.to_s #=> "2015-11-30T11:37:25-08:00"
ENV['TZ'] = 'UTC'
Time.now #=> 2015-11-30 19:37:38 +0000
DateTime.now.to_s #=> "2015-11-30T19:37:36+00:00"

2

Irb में:

>>d = DateTime.now
=> #<DateTime: 11783702280454271/4800000000,5/12,2299161>
>> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}"
=> "11:16:41"

समय को utc में बदल देगा। लेकिन पोस्ट के रूप में अगर यह सिर्फ समय आप उपयोग कर सकते हैं:

Time.now.utc

और इसे सीधे प्राप्त करें।


1

दिनांक समय का स्ट्रिंग प्रतिनिधित्व टाइम क्लास द्वारा पार्स किया जा सकता है।

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.