2011-10-24 24 views
7

मेरी वेबसाइट विभिन्न स्थानोंदिनांक समय मुद्दा जब सर्वर की वैश्विक संस्कृति अलग सर्वर

पर कई सर्वरों पर होस्ट की है पर अलग है हर जगह डेटा स्वरूप की संस्कृति different- है हम हर जगह लेकिन बैठाना कुछ सर्वर mm/dd/yyyy स्वरूप का उपयोग संस्कृति dd/mm/yyyy पर सेट है तो हमारी वेबसाइट डेटाटाइम अपवाद उत्पन्न करती है।

+4

: क्या आप भ्रमित कर रहा है? –

उत्तर

11

आपको यह निर्दिष्ट करना चाहिए कि जब भी आप एक स्ट्रिंग को किसी तारीख में परिवर्तित करते हैं तो आप किस संस्कृति का उपयोग करना चाहते हैं।

जिस संस्कृति का आप उपयोग करना चाहिए, उस पर निर्भर करता है कि किस तारीख को दिनांकित किया गया है।उदाहरण के लिए, सभी तिथियों आप को पार्स कर रहे हैं स्वरूपित कर रहे हैं या स्लोवाक:

String s = "24. 10. 2011"; 

तो फिर तुम स्ट्रिंग पार्स करने की जरूरत है जैसे कि यह स्लोवाक (स्लोवाकिया) में थे (sk-SK) संस्कृति:

//Bad: 
d = DateTime.Parse(s); 

//Good: 
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia) 

अपनी तिथियाँ ताजिक (ताजिकिस्तान सिरिलिक) में सभी कर रहे हैं, तो आप tg-Cryl-Tj के रूप में यह पार्स करने के लिए की जरूरत है:

String s = "24.10.11" 

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj")); 

जो प्रश्न का कारण बनता है: आप किस दिनांक प्रारूप का उपयोग कर रहे हैं? आपको सर्वर की लोकेल सेटिंग पर भरोसा नहीं करना चाहिए, आपको यह तय करना चाहिए कि आप कौन सा प्रारूप चाहते हैं।

//Bad 
String s = d.ToString(); 

//Good 
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka) 

//s = "2011-10-24 12:00:00 පෙ.ව." 

मुझे संदेह है कि आप अंग्रेजी में सबकुछ करना पसंद करते हैं।

  • en-AU (अंग्रेजी ऑस्ट्रेलिया): 24/10/2011
  • en-IA (English भारत): 24-10-2011
  • en-ZA (English दक्षिण अफ्रीका): लेकिन फिर आप जो अंग्रेजी के संस्करण निर्णय करना है 2011/10/24
  • en-US (अंग्रेजी संयुक्त राज्य): 10/24/2011

मुझे संदेह है कि आप अंग्रेजी (भारत) (en-IA) पसंद करते हैं।


यदि आपको वास्तव में क्या संस्कृति जब तार और उपाध्यक्ष प्रतिकूल करने के लिए दिनांक परिवर्तित करने, और एक उपयोगकर्ता के लिए दिनांक दिखाया जाएगा कभी नहीं कर रहे हैं प्रयोग करने का फैसला नहीं कर सकते, तो आप अपरिवर्तनीय संस्कृति उपयोग कर सकते हैं:

String s = "10/24/2011" //invariant culture formatted date 

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date 

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string 
व्यक्ति जो बंद करने के लिए है क्योंकि "यह बताने के लिए कि यहाँ क्या कहा जा रहा है मुश्किल है" मतदान करने के लिए
+0

अद्भुत स्पष्टीकरण के लिए धन्यवाद – Murtaza

+1

आपको कभी भी डोमेन या ओएस से किसी भी संस्कृति सेटिंग्स का उपयोग नहीं करना चाहिए। यदि कोई भी किसी भी कारण से इन्हें ओवरराइड करता है (जैसे कोई अन्य ऐप सही काम नहीं कर रहा है) तो आपका एप्लिकेशन काम करना बंद कर देता है। यदि प्रारूप हमेशा समान होता है तो आपको tryparseexact या parseexact का उपयोग करना चाहिए। – Peter

+0

इन सबके लिए, विंडोज़ 10 पर रिक्त स्थान के बिना डिफॉल्ट स्का डेट प्रारूप है। – Fanda

0

कभी भी सर्वर के डिफ़ॉल्ट लोकेल पर भरोसा करते हैं। आपके मामले के लिए, इस का अर्थ है:

  • उपयोग बयान जहां (अस्वरूपित) तिथि वस्तु और नहीं के रूप में (प्रारूपित) स्ट्रिंग वस्तु के रूप में की तारीख से पारित तैयार किया। आपको अपने आवेदन में तिथियों का प्रतिनिधित्व करने के लिए स्ट्रिंग का कभी भी उपयोग नहीं करना चाहिए, क्योंकि आप उन पर दिनांक-विशिष्ट कार्य नहीं कर सकते हैं (जैसे 1 महीने जोड़ना, वर्तमान सप्ताह का अंतिम दिन इत्यादि)

  • SQL फ़ंक्शंस का उपयोग करें to_date और to_char हर जगह (सटीक नाम अपने डीबीएमएस पर निर्भर करते हैं), तो आपको वास्तव में आपके आवेदन

+0

सरल और समझ समाधान धन्यवाद, लेकिन इयान बॉयड ने समझाया है कि हमें इस पार्सिंग पर क्यों काम करना चाहिए। आप दोनों को धन्यवाद। – Murtaza

1

कभी नहीं, कभी, आंतरिक तारों के रूप में की दुकान तारीखों में स्ट्रिंग वस्तुओं का उपयोग करने की आवश्यकता है। डेटाबेस में नहीं, आपके ऐप में नहीं।

यदि आपको सर्वर के बीच दिनांक मानों को स्थानांतरित करने की आवश्यकता है, तो बाइनरी जाएं। या यदि आपको वास्तव में तारों का उपयोग करना है, तो ToString(CultureInfo.InvariantCulture) का उपयोग करें - या बस Ticks संपत्ति को क्रमबद्ध करें।

साथ ही, कोड का उपयोग करके बनाए गए SQL आदेशों का उपयोग करके डेटाबेस को स्ट्रिंग के रूप में कभी भी पास न करें। उस के लिए SqlParameter का उपयोग करें, या इससे भी बेहतर, कुछ ओ/आर मैपर पर निर्भर करें, जैसे एंटीटी फ्रेमवर्क या लिंक से एसक्यूएल।

0

यदि किसी ऐसे सर्वर पर तैनात किया गया है जो आपके नियंत्रण में नहीं है, तो यह सुनिश्चित करना महत्वपूर्ण है कि आपके कोड में संस्कृति पर हार्ड-कोडित निर्भरता न हो।

आप शायद डेटटाइम के लिए अपना कोड खोजना चाहेंगे। पर्स या इसी तरह के। हमारे पास DateTime पर एक्सटेंशन विधियों का एक सेट है जिसे हम सही संस्कृति को मजबूर करने के लिए उपयोग करते हैं।

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