2011-06-22 12 views
6

मैं एक बहुत चारों ओर देखा और स्ट्रिंग हेरफेर करने के लिए कोड का एक भयानक टुकड़ा लेखन की कमी है, मैं अगर कोई यह छँटाई का एक अच्छा तरीका जानता है पूछना चाहेंगे:दिनांक समय समस्या है जब दिन <= 12

03/05/2011
27/05/2011
31/05/2011
03/05/2011
:

मैं कोशिकाओं है कि मैं इस तरह के रूप में बाहर खींच रहा हूँ में तारीख तार का एक समूह है 09/05/2011
31/05/2011
आदि

जबकि मैं किसी भी प्रविष्टि को पढ़ रहा हूं जहां दिन एक महीने के रूप में समझा जा सकता है - यानी ऊपर प्रविष्टियां 1, 4 और 5 - इसे दिन और महीने के साथ डेटटाइम के रूप में रखा जाता है।

उदाहरण के लिए, 03/05/2011 को डेटटाइम के रूप में पढ़ा जाता है "05/03/2011 00:00:00" अन्य सभी पढ़ते हैं और अच्छी तरह से मुझे "27/05/2011 "।

मैं Excel से जानकारी हो रही है,

((Excel.Range)worksheet.Cells[rowCount, 3]).Value.ToString() 

का उपयोग कर अगर मैं अपने अन्य लाइनों के साथ के रूप में Value2 कोशिश, यह "40,607" जैसी चीजों के रूप में उन अजीब दिनांकों पढ़ता है लेकिन फिर, अन्य तिथियों पढ़ा जाएगा सामान्य रूप से।

+0

आप किस संस्कृति/लोकेल का उपयोग कर रहे हैं? – Skurmedel

+0

@ स्कुरमेडेल: एन-जीबी (27/05/2011 जैसी तिथियों की मेरी आवश्यकता इसे दूर देनी चाहिए) लेकिन यह स्थानीयकरण समस्या प्रतीत नहीं होती है। यह केवल अजीब व्यवहार हो गया है जब केवल उन तिथियों को पढ़ना जहां यह संदिग्ध हो सकता है कि दिन और महीनों के आसपास किस तरह से संदिग्ध हो सकता है। अन्य सभी entires पूरी तरह से पढ़ रहे हैं। – Aidan

उत्तर

8

आप एक DateTime वस्तु के लिए एक स्ट्रिंग में कनवर्ट करने DateTime.ParseExact फ़ंक्शन का उपयोग करें, तो आप किसी भी स्ट्रिंग परिवर्तन करने के लिए बिना (जो की तरह "दिन/माह/वर्ष" दिखता है) अपनी तिथियाँ द्वारा प्रयोग किया जाता विशिष्ट प्रारूप निर्दिष्ट कर सकते हैं।

उदाहरण: कस्टम दिनांक और समय प्रारूप तारों पर

var dateString = "03/05/2011"; 

var format = "dd/MM/yyyy"; 

var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

अधिक जानकारी पाया जा सकता है here


संपादित करें:DateTime.FromOADate विधि का उपयोग कर एक DateTime वस्तु को Range.Value2 संपत्ति के द्वारा दिए गए मान परिवर्तित करने के लिए प्रयास करें, उदा कुछ इस तरह:

var dateTime = DateTime.FromOADate(((Excel.Range)worksheet.Cells[rowCount, 3]).Value2); 
+0

मैंने ऐसी चीजों की कोशिश की है। मेरी समस्या यह है कि सेल में मूल्य पढ़ने पर तुरंत, यह इसे गलत तरीके से डेटटाइम के रूप में पढ़ रहा है इससे पहले कि मैंने इसे भी पूछा हो। हालांकि, यह बाकी प्रविष्टियों को डेटटाइम के रूप में क्यों नहीं पढ़ेगा? क्या यह वास्तव में कोशिकाओं को पढ़ने पर CultureInfo पर जांच करेगा? – Aidan

+0

@ एडन फिर इसे काम करना चाहिए, ParseExact बिल्कुल आपकी स्थिति के लिए बनाया गया था। –

+0

@ डोनट, क्या आपको अपनी प्रारूप स्ट्रिंग में '/' की आवश्यकता नहीं है? –

0

समस्या क्योंकि अपनी तिथियाँ अमेरिकी संस्कृति या इसी तरह के रूप में पढ़ा जा रहा है।

आप का उपयोग करते हैं निम्नलिखित आप प्रारूप आप अपनी तिथियाँ में होने की उम्मीद निर्दिष्ट कर सकते हैं: का उपयोग

DateTime result; 
if(DateTime.TryParseExact("dd/MM/yyyy", out result)) 
{ 
    // Got an English date 
} 
+1

बहुत सच है, धन्यवाद – Ian

2

DateTime.ParseExact Method बदल देता है अपने दिनांक समय बराबर करने के लिए एक तारीख और समय की निर्दिष्ट स्ट्रिंग प्रतिनिधित्व निर्दिष्ट प्रारूप का उपयोग कर और संस्कृति विशिष्ट प्रारूप जानकारी।

स्ट्रिंग प्रतिनिधित्व के प्रारूप निर्दिष्ट प्रारूप हूबहू मिलना चाहिए।

String dateString = "15/06/2008"; 
String format = "dd/MM/yyyy"; 

DateTime result = 
    DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 
1

यह स्थानीयकरण समस्या की तरह लगता है। implicititly अपने स्थान सेट करके देखें।कोशिकाओं में

System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US"); 
+0

मेरे लोकेल में थ्रेड सेट करना या तो चाल नहीं करता है। हालांकि धन्यवाद। – Aidan

1

मैं तारीख तार का एक समूह है कि मैं इस तरह के रूप में बाहर खींच रहा हूँ:

नहीं, आप नहीं कर WPF आवेदन में उदाहरण के लिए यह कुछ ऐसा है। आपके पास स्ट्रिंग्स का मिश्रण है जो और तिथियों की तरह दिखता है जो स्ट्रिंग्स की तरह दिखते हैं। यह एक एक्सेल मुद्दा है, सी # मुद्दा नहीं।

सुनिश्चित नहीं है कि आप स्प्रेडशीट बना रहे हैं, या यदि आप इसे कहीं और से प्राप्त कर रहे हैं। लेकिन समस्या यह है कि एक्सेल पाठ को पार्स करने का प्रयास करता है क्योंकि यह सेल में दर्ज किया गया है। इस मामले में, यह उन तिथियों के बारे में कुछ गलत निर्णय ले रहा है जो इसे पाता है।

यदि आप "03/05/2011" जैसी तारीख दर्ज करते हैं, तो एक्सेल (गलत तरीके से) इसे 5 मार्च, 2011 के रूप में पार्स करेगा, और एक संख्यात्मक दिनांक कोड (40607) के रूप में स्टोर करेगा। इसके बाद यह दिनांक स्वरूपण सेल पर लागू होता है (यह मेरी मशीन पर m/d/yyyy का उपयोग करता है)।

यदि आप "31/05/2011" जैसी तारीख दर्ज करते हैं, तो Excel इसे किसी तारीख के रूप में पार्स नहीं कर सकता है, और यह इसे टेक्स्ट के रूप में संग्रहीत करता है।

यह साबित करने के लिए, कक्षों का चयन करें और संपादन> साफ़> प्रारूप पर जाएं। सभी "बुरी तिथियां" केवल संख्याओं के रूप में दिखाई देगी, बाकी सभी तिथियों की तरह दिखेंगे।

आप कुछ ही विकल्प हैं:

  1. (एक्सेल में प्रवेश किया इसके पहले डेटा को ठीक आगे जोड़ते के साथ सब कुछ एक 'तो इसके सभी पाठ के रूप में दर्ज है, या एक मशीन है कि पर स्प्रेडशीट बनाना सुनिश्चित करें सही तिथि सेटिंग्स।)
  2. एक्सेल से .Value.ToString() का उपयोग न करें, बस .Text का उपयोग करें। यह एक्सेल द्वारा किए गए खराब पार्सिंग को अनदेखा कर देगा, और आपको अन्य उत्तरों के अनुसार ParseExact सी # के साथ एक सतत टेक्स्ट मान (दोनों प्रकारों से) देना चाहिए।

(2) बहुत आसान है, और यदि स्प्रेडशीट पहले से मौजूद है, तो आपकी एकमात्र पसंद हो सकती है।

+0

यूप, मैंने सोचा कि साथ ही मैं इसी तरह की समस्याओं वाले अन्य लोगों के माध्यम से खोज रहा था। का उपयोग करना। टेक्स्ट ने मुझे "########" दर्ज किया है जो दर्ज किया गया है। मुझे लगा कि यह कुछ अजीब होना था कि एक्सेल कर रहा था, लेकिन मेरे जीवन के लिए मैं इसे गोल नहीं कर सकता। सभी कक्ष पहले से स्वरूपित हैं और सही लोकेल पर सेट हैं, लेकिन हां, उन्हें टेक्स्ट पर सेट करने से 40607 स्टाइल प्रविष्टियां दिखाई देंगी। मुझे पढ़ने से पहले सेल प्रारूप को बदलने की ज़रूरत नहीं है, लेकिन ऐसा लगता है कि ऐसा कोई विकल्प नहीं होगा ... – Aidan

+0

'.ext' सचमुच स्प्रेडशीट में दिखाया गया है (सभी स्वरूपण लागू होने के बाद, आदि।) तो एकमात्र तरीका यह वापस लौटाएगा "######" अगर कॉलम दिनांक प्रारूप दिखाने के लिए पर्याप्त नहीं है। क्या यह सचमुच स्प्रेडशीट में "#####" दिखाता है? क्या आप कॉलम को चौड़ा कर सकते हैं, तो ऐसा नहीं है? – BradC

+0

और सेल प्रारूप को बदलने से समस्या ठीक नहीं हो रही है। एक्सेल ने सचमुच तारीखों को गलत तरीके से पार्स कर दिया है, यह महीने और दिन के मूल्यों को बदल दिया है। आप "22 जून, 2011" शैली प्रारूप में बदलकर इसे सत्यापित कर सकते हैं। – BradC

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