स्ट्रिंग को एक मान्य DateTime "प्रारूप dd / MM / yyyy" के रूप में मान्यता नहीं दी गई थी


172

मैं प्रारूप के साथ अपने स्ट्रिंग स्वरूपित मान को दिनांक प्रकार में बदलने का प्रयास कर रहा हूं dd/MM/yyyy

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

समस्या क्या है ? इसमें दूसरा ओवरराइड है जो मांगता है IFormatProvider। यह क्या है? क्या मुझे इसे भी पास करने की आवश्यकता है? यदि हाँ, तो इस मामले के लिए इसका उपयोग कैसे करें?

संपादित करें

Parseऔर के बीच अंतर क्या हैं ParseExact?

संपादित करें २

स्लैक्स और सैम दोनों जवाब मेरे लिए काम कर रहे हैं, वर्तमान में उपयोगकर्ता इनपुट दे रहा है, लेकिन यह मेरे द्वारा आश्वासन दिया जाएगा कि वे मास्कटेक्स्टबॉक्स का उपयोग करके मान्य हैं।

कौन सा उत्तर सभी पहलुओं पर विचार करना बेहतर है जैसे कि टाइप सफ़ेती, प्रदर्शन या कुछ ऐसा जो आप महसूस करते हैं


7
@ एडिट: यही वह दस्तावेज है जिसके लिए है। msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks

2
ParseExact वह है जब आप तारीख स्ट्रिंग के सटीक प्रारूप को जानते हैं, Parse तब होता है जब आप कुछ ऐसा चाहते हैं जो कुछ अधिक गतिशील रूप से संभाल सकता है।
जिंजरब्रेडॉय

जवाबों:


255

का उपयोग करें DateTime.ParseExact

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

8
हमें यहाँ अशक्त क्यों होना है?
शांतनु गुप्ता

3
इनपुट "22/11/2009 12:00:00 AM" या "22/11/2009" हो सकता है। साथ ही विकास मशीन की संस्कृति उत्पादन की संस्कृति से अलग हो सकती है। तो क्या उपरोक्त कोड मूल रूप से काम करेगा?
रहतुर

8
अगर प्रारूप प्रारूप से मेल नहीं खाता है, तो @ सही, पार्स काम नहीं करेगा। ऊपर दिया गया प्रारूप पैटर्न dd/MM/yyyyएक पाठ स्ट्रिंग है जिसमें एक बार में इसे ठीक से पार्स नहीं किया जाएगा। आपको या तो समय से पट्टी करने की आवश्यकता होगी या इसे प्रारूप पैटर्न में शामिल करना होगा। उस ओवरलोड का ParseExactएक प्रारूप प्रारूप की एक सरणी को स्वीकार करता है और पाठ को पार्स करेगा यदि यह उनमें से किसी से मेल खाता है।
सैमुअल नेफ

7
@SamuelNeff CultureInfo.InvariantCultureयदि आप किसी प्रारूप को वैसे भी परिभाषित कर रहे हैं तो आप वर्तमान के बजाय इसका उपयोग क्यों नहीं करते हैं ?
एल्विन वोंग

3
@ टूलकिट कारण यह है कि प्रारूप स्ट्रिंग में स्लैश शाब्दिक स्लैश नहीं हैं। उन्हें वर्तमान संस्कृति में दिनांक विभाजक स्ट्रिंग द्वारा प्रतिस्थापित किया जाता है। तो यह उस संस्कृति पर निर्भर करता है जिस तरह से ऊपर लिखा गया है। सैमुअल नेफ, कोशिश करो Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, यह आपके समाधान को तोड़ देगा। इसे ठीक करने के लिए, "dd'/'MM'/'yyyy"(सिंगल कोट्स के साथ स्लैश की रक्षा) का उपयोग करें, या @"dd\/MM\/yyyy"बैकस्लैश के साथ स्लैश ("बचकर")।
जेपी स्टिग नील्सन

44

आपको कॉल करने की आवश्यकता है ParseExact, जो उस तारीख को पार्स करता है जो आपके द्वारा आपूर्ति किए जाने वाले प्रारूप से मेल खाती है।

उदाहरण के लिए:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

IFormatProviderपैरामीटर तारीख पार्स करने के लिए उपयोग करने के लिए संस्कृति निर्दिष्ट करता है।
जब तक आपका स्ट्रिंग उपयोगकर्ता से नहीं आता है, आपको पास होना चाहिए CultureInfo.InvariantCulture
यदि स्ट्रिंग उपयोगकर्ता से आती है, तो आपको पास होना चाहिए CultureInfo.CurrentCulture, जो उन सेटिंग्स का उपयोग करेगा जो उपयोगकर्ता नियंत्रण कक्ष में क्षेत्रीय विकल्प में निर्दिष्ट हैं।


2
@Slaks: CultureInfo.InvariantCulture कोड में उपलब्ध नहीं है। क्या मुझे कुछ नाम स्थान का उपयोग करने की आवश्यकता है
शांतनु गुप्त

3
using System.Globalization;
SLKs

2
आप त्रुटि पर राइट क्लिक भी कर सकते हैं और समाधान पर क्लिक करें यह आपके लिए लापता नामस्थान में डाल देगा।
इनकिन

आप त्रुटि पर डबल क्लिक भी कर सकते हैं और संबंधित नेमस्पेस का उपयोग करके एक तीर को नीचे देख सकते हैं
उस्मान यूनास

रिक्त स्थान की भी गणना की जाती है, इसलिए उदाहरण के लिए यदि आपका स्ट्रिंग प्रारूप "MM / dd / yyyy HH: mm: ss" (नोट - 2 रिक्त स्थान) है - तो ParseExact के लिए आपके प्रारूप में रिक्त स्थान भी शामिल होना चाहिए
क्रिस

20

डेटाइम का एक स्ट्रिंग प्रतिनिधित्व पार्स करना एक मुश्किल बात है क्योंकि विभिन्न संस्कृतियों में अलग-अलग तारीख प्रारूप होते हैं। .Net इन तारीख स्वरूपों से अवगत है और System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormatजब आप कॉल करते हैं तो उन्हें आपकी वर्तमान संस्कृति ( ) से खींचता है DateTime.Parse(this.Text);

उदाहरण के लिए, स्ट्रिंग "22/11/2009" संयुक्त राज्य अमेरिका (एन-यूएस) के लिए शॉर्टडेटैटर्न से मेल नहीं खाता है, लेकिन यह फ्रांस (एफआर-एफआर) के लिए मेल खाता है।

अब, आप या तो DateTime.ParseExactसटीक प्रारूप स्ट्रिंग में कॉल कर सकते हैं और पास कर सकते हैं जिसकी आप अपेक्षा कर रहे हैं, या आप DateTime.Parseतिथि को पार्स करने के लिए एक उपयुक्त संस्कृति में पास कर सकते हैं ।

उदाहरण के लिए, यह आपकी तिथि को सही ढंग से परिभाषित करेगा:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

बेशक, आपको केवल बेतरतीब ढंग से फ्रांस नहीं चुनना चाहिए, लेकिन आपकी आवश्यकताओं के लिए उपयुक्त कुछ।

आपको यह पता लगाने की आवश्यकता है कि क्या System.Threading.Thread.CurrentThread.CurrentCultureसेट किया गया है, और यदि यह आपकी अपेक्षा से भिन्न है / है तो क्यों।


आपका समाधान मेरे लिए काम नहीं करता है, यह त्रुटि देता है जैसे "स्ट्रिंग को मान्य दिनांक समय के रूप में मान्यता नहीं दी गई थी।" और मैं इनपुट तिथि के बाद गुजर रहा हूं: "13/06/17" आपके समाधान के लिए लेकिन यह त्रुटि देता है। कृपया मेरी मदद करें।
घनश्याम लखानी

16

हालांकि उपरोक्त समाधान प्रभावी हैं, आप निम्न के साथ webconfig फ़ाइल को भी संशोधित कर सकते हैं ...

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

Ref: उत्पादन मशीन की तुलना में स्थानीय मशीन पर अलग-अलग प्रारूप


1
अमित फिलिप्स, आपने मेरा दिन बचाया .. मैंने सभी संभव चीजों की कोशिश की थी। और यह छोटा सा बदलाव काम करता है। धन्यवाद।
RNH

1
अमित, तुम सच में भगवान के बेटे हो।
उग्र भालू

10

आपको उस विशिष्ट दिनांक प्रारूप के लिए संस्कृति निर्दिष्ट करने की आवश्यकता हो सकती है:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);

अधिक जानकारी के लिए यहां जाएं:

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx


4

बहुत समय बिताने के बाद मैंने समस्या हल की है

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);

3

स्ट्रिंग को डेटाइम में बदलने के लिए इसका उपयोग करें:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)


2
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}

1

जैसे ऊपर किसी ने कहा कि आप इसे एक स्ट्रिंग पैरामीटर के रूप में भेज सकते हैं, लेकिन इसके पास यह प्रारूप होना चाहिए: उदाहरण के लिए '20130121' और आप इसे सीधे नियंत्रण से लेते हुए उस प्रारूप में परिवर्तित कर सकते हैं। तो आप इसे एक टेक्स्टबॉक्स से उदाहरण के लिए प्राप्त करेंगे जैसे:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

इसे बदलने के लिए: '20130121' का आप उपयोग करें:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

ताकि SQL इसे रूपांतरित कर सके और अपने डेटाबेस में डाल सके।


0

आप भी उपयोग कर सकते हैं

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day

0

मेरे लिए कोड के नीचे काम किया:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

नाम स्थान

using System.Globalization;

-6

मैन्युअल रूप से बदलें:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

11/22/2015 से इसे 22/11/2015 में परिवर्तित कर दिया जाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.