2012-04-01 10 views
24

मुझे रूबी में यूटीसी से दिए गए टाइमज़ोन के ऑफसेट की गणना करने की आवश्यकता है। कोड की यह पंक्ति मेरे लिए काम कर रहा था, या तो मैंने सोचा था कि:रूबी में यूटीसी से दिए गए टाइमज़ोन के घंटों में ऑफसेट की गणना कैसे की जा सकती है?

offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f/3600.0 

लेकिन, यह पता चला है कि मेरे लिए लौट रहा था स्टैंडर्ड ऑफसेट, नहीं डीएसटी ऑफसेट। उदाहरण के लिए,

self.timezone = "America/New_York" 

मान अगर मैं, ऊपर लाइन, offset_in_hours = -5 नहीं चला -4 एकदम सही ढंग से यह देखते हुए कि तिथि आज 1 अप्रैल, 2012 है

किसी को भी मुझे सलाह कर सकते हैं यूटीसी से ऑफसेट_इन_होर्स की गणना कैसे करें रूबी में एक वैध स्ट्रिंग टाइमज़ोन दिया गया है जो मानक समय और डेलाइट बचत दोनों के लिए जिम्मेदार है?

धन्यवाद!


अद्यतन

यहाँ आईआरबी से कुछ उत्पादन होता है। ध्यान दें कि न्यू यॉर्क क्योंकि डेलाइट सेविंग यूटीसी, नहीं 5 के पीछे 4 घंटे है,:

>> require 'tzinfo' 
=> false 
>> timezone = "America/New_York" 
=> "America/New_York" 
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset/(60*60) 
=> -5 
>> 

यह पता चलता है वहाँ TZInfo में एक बग है या यह डीएसटी-बारे में पता नहीं है


अद्यतन कि 2

प्रति joelparkerhender की टिप्पणियां, उपर्युक्त कोड में बग यह है कि मैं utc_offotal का उपयोग कर रहा था, utc_total_offset नहीं।

इस प्रकार, अपने मूल प्रश्न प्रति, कोड के सही लाइन है:

offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f/3600.0 

उत्तर

52

हाँ, इस तरह TZInfo का उपयोग करें:

current = tz.current_period 
:

require 'tzinfo' 
tz = TZInfo::Timezone.get('America/Los_Angeles') 

वर्तमान अवधि प्राप्त करने के लिए

यह पता लगाने के लिए कि क्या डेलाइट बचत समय सक्रिय है:

current.dst? 
#=> true 

आधार सेकंड में यूटीसी से समय क्षेत्र की भरपाई करने के लिए:

current.std_offset 
#=> 3600 which is 1 hour; this is because right now we're in daylight savings 

कुल यूटीसी से ऑफसेट करने के लिए:

current.utc_offset 
#=> -28800 which is -8 hours; this does NOT include daylight savings 

डेलाइट सेविंग मानक समय से ऑफसेट पाने के लिए:

current.utc_total_offset 
#=> -25200 which is -7 hours 

यूटीसी से कुल ऑफसेट utc_offset + std_offset के बराबर है।

यह स्थानीय समय से ऑफसेट है जहां डेलाइट बचत प्रभावी है, सेकंड में।

+0

मुझे समझने में सहायता करें - यदि current_period dst के माध्यम से जागरूक है? वह डेलाइट बचत समय सक्रिय या निष्क्रिय है, तो current_period.offset क्यों विचार में नहीं ले रहा है? क्या यह एक बग है? आखिरकार, मुझे टाइमज़ोन में इन सभी विधियों के बारे में पता है, मेरा लक्ष्य वैरिएबल ऑफसेट_इन_होर्स – esilver

+0

पर सही मान असाइन करना है, कृपया मेरा आउटपुट देखें, आईआरबी चलाने से - यह सुझाव देता है कि tzinfo वास्तव में, डीएसटी-जागरूक नहीं है, या एक बग है? – esilver

+0

कोई बग नहीं - आपको बस डीएसटी के लिए खाते की आवश्यकता है। मैंने दो और तरीकों के उत्तर में जानकारी जोड़ दी है जो दिखाती है कि इसे कैसे करें। – joelparkerhenderson

संबंधित मुद्दे