दिलचस्प पोस्ट
Php.ini फ़ाइल को कैसे खोजें (xampp) मैं C ++ 'for' लूप में दो वेतनभोगी विवरण कैसे डालूं? स्प्रिंग – पर निर्भरता इंजेक्शन एक ServletContextListener सही IOS XML पार्सर का चयन पोस्टग्रेएसक्यूएल "डेस्रीब टेबल" क्या एनाकोंडा प्रत्येक नए पर्यावरण के लिए एक अलग पीआईथोनपाथ चर बनाते हैं? आईफ़ोन और ओपनसीवी जावा – अपारदर्शी रंग अजगर में समय-समय पर फ़ंक्शन चलाने के लिए एक स्रोत बनाने के लिए, जो बाद में एक विधि कॉल के माध्यम से तत्व प्राप्त कर सकता है? छवि के पहलू अनुपात को बनाए रखते हुए आप <div> को भरने के लिए एक छवि कैसे बढ़ाएं? एंड्रॉइड डाटाबेस लॉक पायथन 3 के "फंक्शन एनोटेशन" के लिए अच्छे उपयोग क्या हैं एंड्रॉइड: आशय के माध्यम से एक विशिष्ट फ़ोल्डर कैसे खोलें और फ़ाइल ब्राउज़र में इसकी सामग्री दिखाएं? अलग बनाम जुड़ने योग्य POSIX धागे

MySQL datetime फ़ील्ड और डेलाइट बचत समय – मैं "अतिरिक्त" घंटे का संदर्भ कैसे दूं?

मैं अमेरिका / न्यूयॉर्क समयक्षेत्र का उपयोग कर रहा हूं पतन में हम "एक घंटा पीछे" एक घंटे – प्रभावी रूप से 2:00 पर एक घंटे "प्राप्त" संक्रमण बिंदु पर निम्न होता है:

यह 01:59:00 -04: 00 है
तो 1 मिनट बाद यह हो जाता है:
01:00:00 -05: 00

तो अगर आप बस "1:30 बजे" कहें तो यह अस्पष्ट है कि आप पहली बार 1:30 रोल के आसपास या दूसरे का संदर्भ दे रहे हैं या नहीं मैं एक MySQL डाटाबेस में शेड्यूलिंग डेटा को सहेजने की कोशिश कर रहा हूं और यह निर्धारित नहीं कर सकता कि समय कैसे ठीक से बचाया जाए।

यहाँ समस्या है:
"2009-11-01 00:30:00" आंतरिक रूप से 2009-11-01 00:30:00 -04: 00 के रूप में संग्रहीत किया जाता है
"2009-11-01 01:30:00" आंतरिक रूप से 2009-11-01 01:30:00 -05: 00 के रूप में संग्रहीत किया जाता है

यह ठीक है और काफी उम्मीद है लेकिन मैं 01:30:00 -04: 00 को कुछ भी कैसे बचा सकता हूं? प्रलेखन ओफ़्सेट को निर्दिष्ट करने के लिए कोई समर्थन नहीं दिखाता है, और तदनुसार, जब मैंने ओफ़्सेट निर्दिष्ट करने की कोशिश की है जिसे विधिवत अनदेखा कर दिया गया है।

मैंने सोचा था कि एकमात्र समाधान एक समयक्षेत्र में सर्वर को सेट करना शामिल है जो डेलाइट बचत समय का उपयोग नहीं करता है और मेरी स्क्रिप्ट में आवश्यक परिवर्तन करता है (मैं इसके लिए PHP का उपयोग कर रहा हूं) लेकिन ऐसा लगता नहीं है कि यह आवश्यक होना चाहिए।

किसी भी सुझाव के लिए बहुत धन्यवाद

वेब के समाधान से एकत्रित समाधान "MySQL datetime फ़ील्ड और डेलाइट बचत समय – मैं "अतिरिक्त" घंटे का संदर्भ कैसे दूं?"

MySQL की तारीख प्रकार, स्पष्ट रूप से, टूटा हुआ है और जब तक कि आपका सिस्टम एक ऑफसेट टाइमज़ोन, जैसे यूटीसी या जीएमटी -5 के लिए सेट नहीं है तब तक सही तरीके से सभी बार स्टोर नहीं कर सकता। (मैं MySQL 5.0.45 का उपयोग कर रहा हूँ)

ऐसा इसलिए है क्योंकि डेलाइट सेविंग टाइम समाप्त होने से पहले आप किसी भी समय किसी भी समय स्टोर नहीं कर सकते । कोई भी बात नहीं है कि आप कैसे इनपुट दिनांक, हर तिथि समारोह इन समय का इलाज होगा जैसे कि वे स्विच के बाद के घंटे के दौरान हैं

मेरे सिस्टम का समयक्षेत्र America/New_York चलो 1257051600 (सूर्य, 01 नवम्बर 06:00:00 +0100) को संसाधित करने का प्रयास करें।

यहां स्वामित्व INTERVAL वाक्यविन्यास का उपयोग किया जा रहा है:

 SELECT UNIX_TIMESTAMP('2009-11-01 00:00:00' + INTERVAL 3599 SECOND); # 1257051599 SELECT UNIX_TIMESTAMP('2009-11-01 00:00:00' + INTERVAL 3600 SECOND); # 1257055200 SELECT UNIX_TIMESTAMP('2009-11-01 01:00:00' - INTERVAL 1 SECOND); # 1257051599 SELECT UNIX_TIMESTAMP('2009-11-01 01:00:00' - INTERVAL 0 SECOND); # 1257055200 

यहां तक ​​कि FROM_UNIXTIME() सटीक समय वापस नहीं आएगा

 SELECT UNIX_TIMESTAMP(FROM_UNIXTIME(1257051599)); # 1257051599 SELECT UNIX_TIMESTAMP(FROM_UNIXTIME(1257051600)); # 1257055200 

अजीब तरह से, DATETIME अभी भी स्टोर और वापसी (केवल स्ट्रिंग रूप में!) समय "खो" घंटे के भीतर जब डीएसटी शुरू होता है (जैसे 2009-03-08 02:59:59 )। लेकिन किसी भी MySQL फ़ंक्शन में इन तिथियों का उपयोग जोखिमपूर्ण है:

 SELECT UNIX_TIMESTAMP('2009-03-08 01:59:59'); # 1236495599 SELECT UNIX_TIMESTAMP('2009-03-08 02:00:00'); # 1236495600 # ... SELECT UNIX_TIMESTAMP('2009-03-08 02:59:59'); # 1236495600 SELECT UNIX_TIMESTAMP('2009-03-08 03:00:00'); # 1236495600 

ख़राब: यदि आपको वर्ष में हर बार स्टोर करने और पुनर्प्राप्त करने की आवश्यकता है, तो आपके पास कुछ अवांछनीय विकल्प हैं:

  1. सिस्टम टाइमज़ोन को जीएमटी + कुछ स्थिर ऑफसेट सेट करें उदाहरण यूटीसी
  2. स्टोर के रूप में INTs (हारून की खोज के रूप में, TIMESTAMP विश्वसनीय नहीं है)

  3. DATETIME प्रकार का नाटक करना कुछ निरंतर ऑफसेट टाइमज़ोन है उदाहरण यदि आप America/New_York , तो अपनी तारीख को MySQL के बाहर जीएमटी -5 में बदल दें, फिर एक DATETIME के ​​रूप में स्टोर करें (यह आवश्यक हो जाता है: हारून का उत्तर देखें)। फिर, आपको MySQL की दिनांक / समय फ़ंक्शंस का उपयोग करने के लिए बहुत सावधानी बरतनी चाहिए, क्योंकि कुछ मानते हैं कि आपके मान सिस्टम टाइमज़ोन के हैं, अन्य (विशेष समय के अंकगणित फ़ंक्शन) "समयक्षेत्र अज्ञेय" (वे व्यवहार कर सकते हैं जैसे कि समय यूटीसी है)।

हारून और मुझे संदेह है कि स्वत: पैदा होने का TIMESTAMP कॉलम भी टूटा हुआ है। 2009-11-01 01:30 -0400 और 2009-11-01 01:30 -0500 2009-11-01 01:30 -0400 दोनों को अस्पष्ट 2009-11-01 01:30 रूप में संग्रहित किया जाएगा।

मुझे अपने उद्देश्यों के लिए यह पता चल गया है मैं जो मैंने सीखा है संक्षेप करेंगे (माफ करना, ये नोट्स वर्बोज़ हैं; वे मेरे भविष्य के सिफ़ारिश के लिए जितना कुछ भी उतना ही हैं)।

मेरे पिछले टिप्पणियों में से एक के मुताबिक, DATETIME और TIMESTAMP फ़ील्ड अलग तरीके से व्यवहार करते हैं I TIMESTAMP फ़ील्ड (डॉक्स के रूप में इंगित करते हैं) जो भी आप "YYYY-MM-DD hh: mm: ss" प्रारूप में भेजते हैं उसे लेते हैं और इसे अपने वर्तमान समयक्षेत्र से यूटीसी समय में कनवर्ट करते हैं। रिवर्स पारदर्शी होता है जब भी आप डेटा पुनः प्राप्त करते हैं। DATETIME फ़ील्ड इस रूपांतरण को नहीं बनाते हैं वे जो भी आप उन्हें भेजते हैं लेते हैं और इसे सीधे सीधे स्टोर करते हैं

न तो DATETIME और न ही TIMESTAMP फ़ील्ड प्रकार सही समय पर डेटा संग्रहीत कर सकते हैं जो डीएसटी को देखता है । यदि आप "200 9 -2011 01:30:00" स्टोर करते हैं, तो फ़ील्ड में अंतर करने का कोई तरीका नहीं है, जो आपको 1:30 बजे का संस्करण चाहते हैं -04: 00 या -05: 00 संस्करण।

ठीक है, इसलिए हमें अपने डेटा को एक गैर डीएसटी समयक्षेत्र (जैसे यूटीसी) में संग्रहित करना होगा। TIMESTAMP फ़ील्ड इस डेटा को सही तरीके से संभालने में असमर्थ हैं, जिससे मैं समझाऊंगा: यदि आपका सिस्टम डीएसटी समयक्षेत्र पर सेट है तो आप TIMESTAMP में जो भी डालते हैं वह हो सकता है कि आप जो वापस वापस न लें यहां तक ​​कि अगर आप यह डेटा भेजते हैं जिसे आपने पहले ही यूटीसी में परिवर्तित कर दिया है, तो यह अभी भी आपके स्थानीय समयक्षेत्र में आंकड़े ग्रहण करेगा और यूटीसी में एक और रूपांतरण करेगी। यह टाइमस्टैम्प लागू स्थानीय-टू-यूटीसी-बैक-टू-लोकल राउंडटिप हानिपूर्ण है, जब आपका स्थानीय समयक्षेत्र डीएसटी को देखता है ("200 9 -2011 01:30:00" के बाद से नक्शे को 2 अलग-अलग समय के लिए)।

DATETIME के ​​साथ आप अपने डेटा को किसी भी समयजोन में संग्रहीत कर सकते हैं और यह आश्वस्त रहें कि आप जो कुछ भी भेजते हैं उसे आप वापस ले लेंगे (आपको टाइमस्टैम्प फ़ील्ड पर आपको फंसने वाले हानिपूर्ण roundtrip रूपांतरणों में मजबूर नहीं हैं)। तो समाधान एक DATETIME फ़ील्ड का उपयोग करना है और फ़ील्ड में आपके सिस्टम टाइम ज़ोन से जो भी गैर-डीएसटी ज़ोन में आप इसे सहेजना चाहते हैं, उसमें सहेजने से पहले (मुझे लगता है कि यूटीसी शायद सबसे अच्छा विकल्प है)। इससे आप रूपांतरण तर्क को अपनी स्क्रिप्टिंग भाषा में बना सकते हैं ताकि आप स्पष्ट रूप से "2009-11-01 01:30:00 -04: 00" या "2009-11-01 01:30 के यूटीसी समतुल्य को बचा सकें: 00 -05: 00 "।

एक और महत्वपूर्ण बात यह है कि यदि आप अपनी तिथियां डीएसटी टीज़ में स्टोर करते हैं तो MySQL की डेट / टाइम मैथ फ़ंक्शन डीएसटी सीमाओं के आसपास ठीक से काम नहीं करती है। तो यूटीसी में बचाने के लिए और अधिक कारण।

संक्षेप में, मैं अब यह करता हूं:

डेटाबेस से डेटा प्राप्त करते समय:

सटीक यूनिक्स टाइमस्टैम्प प्राप्त करने के लिए MySQL के बाहर यूटीसी के रूप में डेटा से स्पष्ट रूप से व्याख्या करें। मैं इस के लिए PHP का स्ट्रॉटोमियम () फ़ंक्शन या इसके डेटटाइम वर्ग का उपयोग करता हूँ यह MySQL के अंदर मज़बूती से MySQL के CONVERT_TZ () या UNIX_TIMESTAMP () फ़ंक्शंस का उपयोग नहीं किया जा सकता है क्योंकि CONVERT_TZ केवल 'YYYY-MM-DD hh: mm: ss' मान जो अस्पष्टता समस्याओं से ग्रस्त है, और UNIX_TIMESTAMP () का उत्पादन करेगा इनपुट सिस्टम समयक्षेत्र में है, न कि समयक्षेत्र में डेटा वास्तव में संग्रहीत किया गया था (यूटीसी)।

डाटाबेस को डाटा भंडारण करते समय:

अपनी तिथि को सटीक यूटीसी समय में परिवर्तित करें, जिसे आप MySQL के बाहर की इच्छा रखते हैं। उदाहरण के लिए: PHP की डेटटाइम कक्षा के साथ आप "2009-11-01 1:30:00 ईएसटी" को स्पष्ट रूप से "2009-11-01 1:30:00 EDT" से निर्दिष्ट कर सकते हैं, फिर उसे यूटीसी में कनवर्ट करें और सही यूटीसी समय को बचाएं आपके DATETIME फ़ील्ड में

ओह। सभी के इनपुट और सहायता के लिए बहुत बहुत धन्यवाद उम्मीद है कि यह किसी और को सड़क के नीचे कुछ सिरदर्द बचाता है।

बीटीडब्ल्यू, मैं इसे MySQL 5.0.22 और 5.0.27 पर देख रहा हूं

मुझे लगता है कि Micahwittman के लिंक में इन MySQL सीमाओं का सबसे अच्छा व्यावहारिक समाधान है: जब आप कनेक्ट होते हैं तो सत्र का समय क्षेत्र यूटीसी पर सेट करें:

 SET SESSION time_zone = '+0:00' 

तब आप इसे यूनिक्स टाइमस्टैम्प भेज देंगे और सब कुछ ठीक होना चाहिए।

लेकिन मैं 01:30:00 -04: 00 को कुछ भी कैसे बचा सकता हूं?

आप यूटीसी जैसे कन्वर्ट कर सकते हैं:

 SELECT CONVERT_TZ('2009-11-29 01:30:00','-04:00','+00:00'); 


इससे भी बेहतर, तिथियों को TIMESTAMP फ़ील्ड के रूप में सहेजें। वह हमेशा UTC में संग्रहीत होता है, और यूटीसी गर्मी / सर्दियों के समय के बारे में नहीं जानता है

आप CONVERT_TZ का उपयोग करके यूटीसी से स्थानीय समय में कनवर्ट कर सकते हैं:

 SELECT CONVERT_TZ(UTC_TIMESTAMP(),'+00:00','SYSTEM'); 

जहां '+ 00: 00' यूटीसी है, समयक्षेत्र से है, और 'सिस्टम' ओएस का स्थानीय समय क्षेत्र है जहां MySQL चलता है।

इस थ्रेड ने मुझे अजीब बना दिया क्योंकि हम TIMESTAMP कॉलम का उपयोग On UPDATE CURRENT_TIMESTAMP (यानी: recordTimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) बदल रिकॉर्ड और ईटीएल को recordTimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ट्रैक करने के लिए।

अगर किसी को आश्चर्य होता है कि इस मामले में, TIMESTAMP सही तरीके से व्यवहार करता है और आप TIMESTAMP को यूनिक्स टाइमस्टैम्प में परिवर्तित करके दो समान तिथियों के बीच अंतर कर सकते हैं:

 select TestFact.*, UNIX_TIMESTAMP(recordTimestamp) from TestFact; id recordTimestamp UNIX_TIMESTAMP(recordTimestamp) 1 2012-11-04 01:00:10.0 1352005210 2 2012-11-04 01:00:10.0 1352008810 

मैं पृष्ठों की विज़िट की लॉगिंग की गिनती पर काम कर रहा था और ग्राफ़ में गिनती (फ्लोट jQuery प्लगइन का उपयोग करके) प्रदर्शित करता था। मैंने टेस्ट डेटा के साथ तालिका को भर दिया और सबकुछ ठीक लग गया, लेकिन मैंने देखा कि ग्राफ़ के अंत में एक्स-एक्स पर लेबल्स के अनुसार अंक एक दिन बंद थे। परीक्षा के बाद मैंने देखा कि दिन 2015-10-25 के लिए दृश्य संख्या डेटाबेस से बार-बार दोबारा प्राप्त की गई और फ़्लोट को पारित कर दिया गया, इसलिए इस तिथि के एक दिन बाद प्रत्येक दिन सही स्थानांतरित हो गया।
थोड़ी देर के लिए मेरे कोड में एक बग की तलाश के बाद मुझे एहसास हुआ कि यह तारीख तब होती है जब डीएसटी होता है। तो मैं इस पृष्ठ पर आया …
… लेकिन सुझाए गए समाधान मेरे लिए क्या आवश्यक थे या उनके पास अन्य नुकसान थे मैं अस्पष्ट टाइमस्टैम्प के बीच भेद करने में सक्षम नहीं होने के बारे में बहुत चिंतित नहीं हूं। मुझे केवल प्रति दिन अभिलेख और प्रदर्शन करने की आवश्यकता है

सबसे पहले, मैं दिनांक सीमा पुनः प्राप्त करता हूं:

 SELECT DATE(MIN(created_timestamp)) AS min_date, DATE(MAX(created_timestamp)) AS max_date FROM page_display_log WHERE item_id = :item_id 

फिर, एक लूप में, min_date साथ शुरू, एक दिन ( 60*60*24 ) के चरण से, max_date साथ समाप्त होता है, मैं मायने रखता हूं:

 for( $day = $min_date_timestamp; $day <= $max_date_timestamp; $day += 60 * 60 * 24 ) { $query = " SELECT COUNT(*) AS count_per_day FROM page_display_log WHERE item_id = :item_id AND ( created_timestamp BETWEEN '" . date( "Ymd 00:00:00", $day ) . "' AND '" . date( "Ymd 23:59:59", $day ) . "' ) "; //execute query and do stuff with the result } 

मेरी समस्या का अंतिम और त्वरित समाधान यह था:

 $min_date_timestamp += 60 * 60 * 2; // To avoid DST problems for( $day = $min_date_timestamp; $day <= $max_da..... 

इसलिए मैं दिन की शुरुआत में लूप को नहीं देख रहा हूं , लेकिन दो घंटे बाद । दिन अभी भी वही है, और मैं अभी भी सही संख्याओं को पुनः प्राप्त कर रहा हूं, क्योंकि मैं टाइमस्टैम्प के वास्तविक समय की परवाह किए बिना दिन के 00:00:00 और 23:59:59 के बीच के रिकॉर्ड के लिए डेटाबेस से स्पष्ट रूप से पूछता हूं। और जब समय एक घंटे से कूदता है, मैं अभी भी सही दिन में हूं।

नोट: मुझे पता है कि यह 5 साल का धागा है, और मुझे पता है कि यह ओपी प्रश्न का उत्तर नहीं है, लेकिन यह मेरे जैसे लोगों की मदद कर सकता है जो मैंने इस समस्या का समाधान करने के लिए इस पृष्ठ का सामना किया जो मैंने वर्णित किया था।