2016-11-24 20 views
5

मेरी पर्यावरण

मैं पेरिस में हूँ, फ्रांस (UTC+1 या CET) पर एक Postgres डेटाबेस में निपटने।
यह 12am (00:00) है, हम नवंबर 2016 पर 25 वें स्थान पर हैं।
मेरा पोस्टग्रेस डेटाबेस पर होस्ट किया गया है eu-west-1 क्षेत्र में अमेज़ॅन वेब सेवाविचित्र समय क्षेत्र एडब्ल्यूएस आरडीएस

एक विशिष्ट समय क्षेत्र सेट के साथ इस मुद्दे

current_date (या current_time) के लिए क्वेरी परिणाम है कि साथ संगत नहीं है वितरित करने के लिए ... अपने विश्वासों लगता है।

विशेष रूप से current_date के लिए पूछताछ CET समय क्षेत्र या UTC+1 एक का उपयोग करते समय एक अलग परिणाम उत्पन्न करती है। दो घंटे पहले -

उदाहरण

SET TIME ZONE 'UTC+01'; 
select current_date, current_time; 
 
+------------+--------------------+ 
| date  | timetz    | 
+------------+--------------------+ 
| 2016-11-24 | 22:00:01.581552-01 | 
+---------------------------------+ 

नहीं, कि कल था।


SET TIME ZONE 'CET'; 
select current_date, current_time; 

या

SET TIME ZONE 'Europe/Paris'; 
select current_date, current_time; 
 
+------------+--------------------+ 
| date  | timetz    | 
+------------+--------------------+ 
| 2016-11-25 | 00:00:01.581552-01 | 
+---------------------------------+ 

सही समय और तारीख नहीं है।

प्रश्न

वहां क्या हो रहा है?
क्या यह मेरे लिए बहुत देर हो चुकी है और मैंने UTC+1 और UTC-1 मिश्रित किया है या क्या मैं कुछ बड़ा दिख रहा हूं?

उत्तर

2

यह समस्या अमेज़ॅन आरडीएस से असंबंधित नहीं है: इसे PostgreSQL द्वारा उपयोग किए गए सम्मेलन के साथ करना है। इस मामले में, आप पर समय क्षेत्र का नाम पीछे है। आपका मतलब है 'UTC-01' जहां आप 'UTC+01' लिखते हैं।
the manual से:

एक और मुद्दा यह ध्यान में रखना है कि POSIX समय क्षेत्र के नाम में, सकारात्मक ऑफसेट स्थानों ग्रीनविच पश्चिम लिए उपयोग किया जाता है। हर जगह अन्य, पोस्टग्रेएसक्यूएल आईएसओ -8601 सम्मेलन का पालन करता है जो सकारात्मक टाइमज़ोन ऑफ़सेट पूर्व ग्रीनविच के हैं।

लेकिन 'CET' या 'UTC-01' दोनों अभी भी संभावित गलत पेरिस के लिए है क्योंकि वे दिन के उजाले खाते में समय बचत के लिए नियमों को नहीं ले रहे हैं।
(डीएसटी मानव जाति के इतिहास में सबसे मूर्खता अवधारणाओं से एक है।)

पेरिस (यूरोप के अधिकांश की तरह) गर्मियों के दौरान सर्दी और CEST दौरान सीईटी उपयोग करता है। 'CET' के साथ आपके परीक्षण नवंबर में काम करने के लिए बस होते हैं। यदि आप गर्मियों के समय में ऐसा करने की कोशिश करते हैं, तो आपको गलत परिणाम मिलता है।

सुरक्षित पक्ष पर रहने के लिए, हमेशा समय क्षेत्र का नाम'Europe/Paris' का उपयोग करें, जो डीएसटी नियमों को मानता है। कॉल अधिक महंगा है।

फ़ंक्शन current_time आपके समय क्षेत्र सेटिंग का तात्पर्य है तो कार्य D12 नियमों को ध्यान में रखता है। लेकिन 'UTC-01' एक सादा समय ऑफसेट है। मैं शुरू करने के लिए डेटा प्रकार time with time zone या current_time का उपयोग कभी नहीं करता। मैनुअल एक बार फिर:

हम नहीं प्रकार time with time zone उपयोग करने की अनुशंसा

पर विचार (हालांकि यह विरासत अनुप्रयोगों के लिए और SQL मानक के अनुपालन के लिए PostgreSQL के द्वारा समर्थित है) कार्य करें:

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right 
 plus_wrong  |  minus_right  
---------------------+--------------------- 
2016-06-05 23:00:00 | 2016-06-06 01:00:00 
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_winter 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST' AS cest_summer 
    , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_no_dst -- CET wrong! 
 cet_winter  |  cest_summer  |  cet_no_dst  
---------------------+---------------------+--------------------- 
2016-01-01 01:00:00 | 2016-06-06 02:00:00 | 2016-06-06 01:00:00 -- wrong 
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer 
    , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter 
paris_summer   | paris_winter 
----------------------+---------------------- 
2016-06-06 02:00:00 | 2016-01-01 01:00:00 -- always right 

संबंधित:

+1

नरक, मैं सोचा मैं सिर्फ गलत यह रहा होगा, लेकिन मैं नहीं विचार एक सम्मेलन में जहां एक ** सकारात्मक समय क्षेत्र ऑफसेट वहाँ था ** नहीं है एक सकारात्मक वास्तविक समय ऑफसेट के अनुरूप है। ठीक है, जैसा कि आपने बताया है, हमने समय प्रतिनिधित्व के साथ और भी खराब चीजें देखी हैं और किया है! मैनुअल के सुपर स्पष्ट संदर्भ और बहुत उपयोगी अतिरिक्त जानकारी के लिए धन्यवाद जो मुझे कुछ महीनों में मेरे सिर को खरोंचने से रोक देगा:)। – ccjmne

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