2015-03-16 6 views
5

मैं शेड्यूलिंग इंटरफेस के लिए यूआई डिज़ाइन कर रहा हूं, जहां कोई उपयोगकर्ता भविष्य में टाइमर सेट कर सकता है। यदि संभव हो तो मैं डेलाइट सेविंग को संभालने में सक्षम होना चाहता हूं, मैंने सोचा कि यह काफी आसान होगा। समय की जांच करते समय। गोलांग पैकेज में समय मैं निम्नलिखित असंगतता में भाग गया, अगर ऐसा ही है।गोलांग में डेलाइट सेविंग घंटे

package main 

import (
    "fmt" 
    "time" 
) 

    func main(){ 
     const timeFormat = "2 Jan, 2006 3:04pm (MST)" 
     test , err := time.Parse(timeFormat, "25 Oct, 2015 1:59am (BST)") 
     fmt.Println(test , test.UTC() , err) 
     dur , _ := time.ParseDuration("1m") 
     test = test.Add(dur) 
     fmt.Println(test , test.UTC()) 

     fmt.Println("--------------------" ) 

     test , err = time.Parse(timeFormat, "25 Oct, 2015 2:01am (BST)") 
     fmt.Println(test , test.UTC() , err) 
     test = test.Add(dur) 
     fmt.Println(test , test.UTC()) 

     test = test.Sub(dur) 
     fmt.Println(test , test.UTC()) 
    } 

मुझे पता है कि BST में 25 अक्टू 2015 को 02:00 घड़ी वापस 1:00 जीएमटी (UTC) में जाने के लिए कारण चाहिए। अगर मैं 1:59 बजे बीएसटी में एक मिनट तक बढ़ता हूं तो वास्तव में जीएमटी पर स्विच होता है।

2015-10-25 01:59:00 +0100 BST 2015-10-25 00:59:00 +0000 UTC <nil> 
2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC 
-------------------- 
2015-10-25 02:01:00 +0000 BST 2015-10-25 02:01:00 +0000 UTC <nil> 
2015-10-25 02:02:00 +0000 BST 2015-10-25 02:02:00 +0000 UTC 

लेकिन अगर मैं BST में 2 के बाद एक समय पार्स मैं यह सिर्फ संक्रमण से अधिक समय के लिए होता है incrementing के रूप में जीएमटी करने के लिए स्विच की उम्मीद करेंगे। यदि अतिरिक्त दिनचर्या द्वारा संक्रमणकालीन कोड को बुलाया गया था तो मैं एक मिनट फिर जोड़ता हूं लेकिन यह समय जीएमटी को वापस नहीं करता है।

मैं से एक की उम्मीद है | होने के लिये निम्नलिखित

क) को BST के लिए हमेशा रहने GMT + 1

ख) किसी भी समय जहां BST "अवैध" है करने के लिए स्वचालित रूप से सही जीएमटी को बदलने के लिए समय (अमान्य बीएसटी अक्टूबर में अंतिम रविवार के बाद 2 बजे और अगले साल मार्च में अंतिम वर्ष के बाद 2 बजे के बीच है)

सी) बीएसटी (और शायद अन्य) के साथ उन तिथियों के भीतर एक तिथि बनाई जाने वाली त्रुटि को फेंकने की त्रुटि अन्य देशों में डेलाइट सेविंग घंटे)।

अन्यथा मुझे यह जांचना होगा कि कोई उपयोगकर्ता बीएसटी में किसी तारीख में प्रवेश करता है या नहीं, चाहे वह तिथि बीएसटी के बाहर है या यूटीसी के समय उपयोगकर्ताओं को समायोजित या मजबूर करती है, जो लाइब्रेरी में बनाए गए डेलाइट सेविंग फ़ंक्शंस रखने की वस्तु को हरा देती है।

शोध जबकि मैं इस https://www.youtube.com/watch?v=-5wpm-gesOY देखा और फैसला किया है यह निश्चित रूप से के रूप में सरल मैं पहली बार में ग्रहण किया था के रूप में नहीं है ...

किसी भी अंतर्दृष्टि या एक बेहतर तरीका डेलाइट बचत बार संभालने के लिए सराहना की होगी।

डेबियन खरखरा

संपादित पर जाने संस्करण 1.0.2 का उपयोग करना: जाने संस्करण 1.3.3 का उपयोग कर पुन: प्रयास और इस उत्पादन

2015-10-25 01:59:00 +0100 BST 2015-10-25 00:59:00 +0000 UTC <nil> 
2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC 
-------------------- 
2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC <nil> 
2015-10-25 01:01:00 +0000 GMT 2015-10-25 01:01:00 +0000 UTC 

तो जैसा कि मैं बाद के संस्करणों में की उम्मीद काम करने के लिए प्रकट होता है मिल गया .. यह प्रश्न भी मिला है Daylight saving time and time zone best practices तो इसे पूरी तरह से पढ़ा जाएगा।

धन्यवाद।

+1

सबसे पहले, वर्तमान संस्करण (go1.4.2) का उपयोग करें: [प्रारंभ करना] (http://golang.org/doc/install)। – peterSO

+0

मैं कहूंगा कि गो का एक और हालिया संस्करण का उपयोग एकमात्र उत्तर है, क्योंकि समय और कैलेंडर सामान्य रूप से एक बहुत ही कठिन समस्या है, और हमें अपने स्वयं के लेखन पर मानक लाइब्रेरी फ़ंक्शंस का उपयोग करना पसंद करना चाहिए। –

+0

वह है, जब तक आप जॉन स्कीट नहीं हो जाते। –

उत्तर

9

जाओ, माइक्रोसॉफ्ट के अलावा हर किसी की तरह, IANA Time Zone Database का उपयोग करता है जिसमें नियमित अपडेट्स शामिल हैं जो वर्तमान गो रिलीज में शामिल हैं।

आपने go1.0.3 का उपयोग किया जो मार्च 2012 (Release History) में जारी किया गया था। 2015 के लिए ब्रिटिश समय क्षेत्र डेटा बाद में जोड़ा गया था।

हमेशा समय क्षेत्र गणना के लिए गो के वर्तमान संस्करण का उपयोग करें।

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