तारीख करने के लिए एक स्ट्रिंग परिवर्तित


590

कैसे आप एक स्ट्रिंग को ऐसे में 2009-05-08 14:40:52,531रूपांतरित करते हैं DateTime?


2
@dban एक उत्तर @CMSके रूप में चिह्नित नहीं की गई प्रतिक्रिया क्यों ? एक कारण हो सकता है-मैं उत्सुक हूं।
nam

5
@nam उपयोगकर्ता ने अपना खाता हटा दिया, या उस पर प्रतिबंध लगा दिया, उस पर क्लिक नहीं कर सकता और न ही प्रतिष्ठा / पदक देख सकता है। दुःख की बात है कि हम उसे कुछ अंगूठे दे सकते हैं।
यौम्य्यूम

जवाबों:


753

चूँकि आप 24-घंटे आधारित समय को संभाल रहे हैं और आपके पास सेकंड्स अंश को अलग करने वाला अल्पविराम है, मेरा सुझाव है कि आप एक कस्टम प्रारूप निर्दिष्ट करें:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
अच्छी आँखें। मैंने ओपी में अल्पविराम नहीं देखा।
एलसी।

(मुझे लगता है कि आप तारीख और प्रारूप में कॉमा का उपयोग करने का मतलब है, हालांकि, सही?)
lc।

1
यह ओप्स यूरोपियन लोकेल सेटिंग के कारण केवल एक अल्पविराम है, यदि आप उस कोड को US.Locale के साथ किसी अन्य सर्वर पर ले जाते हैं, तो एक खंड का अंश दशमलव होगा जो सहेजे गए स्ट्रिंग पर अल्पविराम नहीं है, और आपका समाधान टूटना। सुनिश्चित करें कि आप सही पार्सर लगाने से पहले उसके सही लोकेल के लिए आने वाले डेटाइम स्ट्रिंग के प्रकार के लिए एक चेक जोड़ दें। मुझे आश्चर्य है कि Microsoft के पास यह कोड पहले से ही CLR या C # .net में कहीं और नहीं बना है
0:54

इसे आज तक परिवर्तित करने में असमर्थ स्ट्रिंग स्ट्रिंग MyString = "06/22/1916 3:20:14 PM";
विनोद कुमार

दशमलव विभाजक के रूप में 24-घंटे का समय और अल्पविराम एक कस्टम लोकेल नहीं है। इसे विशेष रूप से नियंत्रित करने की आवश्यकता नहीं है।
jpaugh

248

इसके लिए आपके पास मूल रूप से दो विकल्प हैं। DateTime.Parse()और DateTime.ParseExact()

पहला वाक्य रचना के संदर्भ में बहुत क्षमाशील है और कई अलग-अलग प्रारूपों में तारीखों को पार्स करेगा। यह उपयोगकर्ता इनपुट के लिए अच्छा है जो विभिन्न स्वरूपों में आ सकता है।

पार्सएक्सैक्ट आपको पार्सिंग के लिए उपयोग करने के लिए अपनी तिथि स्ट्रिंग के सटीक प्रारूप को निर्दिष्ट करने की अनुमति देगा। इसका उपयोग करना अच्छा है यदि आपकी स्ट्रिंग हमेशा एक ही प्रारूप में है। इस तरह, आप आसानी से अपेक्षित डेटा से किसी भी विचलन का पता लगा सकते हैं।

आप इस तरह उपयोगकर्ता इनपुट पार्स कर सकते हैं:

DateTime enteredDate = DateTime.Parse(enteredString);

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

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"शॉर्ट डेट पैटर्न के लिए खड़ा है ( अधिक जानकारी के लिए MSDN देखें ) और nullनिर्दिष्ट करता है कि स्ट्रिंग को पार्स करने के लिए वर्तमान संस्कृति का उपयोग किया जाना चाहिए।


137

इसे इस्तेमाल करे

DateTime myDate = DateTime.Parse(dateString);

एक बेहतर तरीका यह होगा:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}


26

कोई भी विस्तार विधि लागू नहीं करता है। @ सीएमएस के जवाब की मदद से :

कार्य करना और बेहतर स्रोत का उदाहरण यहां दिया गया है: जिस्ट लिंक

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}

Nobody seems to implemented an extension methodशायद इसलिए नहीं कि जरूरत ...
यूसुफ ने

कभी-कभी standart पुस्तकालय हमारी आवश्यकताओं के अनुरूप नहीं होते हैं। और यही कारण है कि सहायक पुस्तकालयों की आवश्यकता / उपयोग। विस्तार विधि का उपयोग कर, या धाराप्रवाह एपीआई इस तरह ओओपी या इसके विपरीत एफपी पसंद करते हैं। न सही, न गलत। यह पसंद है। @ युसूयलायूब
गनयूस

23

मैंने कई तरह की कोशिश की। मेरे लिए क्या काम था:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data मेरे लिए यह समय 9/24/2017 9:31:34 बजे जैसा था


बेहतर लग रहा है, DateTime चर के लिए अपने मूल्य असाइन कर सकते हैं?
बिरहान नेगा

20

नीचे की कोशिश करें, जहां strDate 'MM / dd / yyyy' प्रारूप में आपकी तारीख है

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
किसी ने उल्लेख नहीं किया कि यह केवल उस विशेष प्रारूप के साथ काम करता है।
टोडुआ

अफ़सोस ... ity कोडर्स हमेशा सोचते हैं कि साथी कोडर्स का पता चलेगा ... अच्छी बात है ... हमें और सोचें ...
कृष्णा


15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

1
आप समय भाग याद किया? मुझे तिथि और समय दोनों चाहिए, मैं यह कैसे कर सकता हूं?
बधोन जैन

15

DateTime.Parse

वाक्य - विन्यास:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

उदाहरण:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • मूल्य: तारीख और समय का स्ट्रिंग प्रतिनिधित्व।
  • प्रदाता: ऑब्जेक्ट जो संस्कृति को विशिष्ट जानकारी प्रदान करता है।
  • शैलियाँ: स्वरूपण विकल्प जो स्ट्रिंग पार्सिंग को कुछ दिनांक और समय पार्सिंग विधियों के लिए अनुकूलित करते हैं। उदाहरण के लिए, AllowWhiteSpaces एक मान है जो स्ट्रिंग में मौजूद सभी रिक्त स्थान को अनदेखा करने में मदद करता है जबकि यह पार्स करता है।

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

  • पार्सिंग एक स्ट्रिंग को आंतरिक संख्या प्रकार में परिवर्तित करता है।

  • आंतरिक संख्यात्मक मान को एक पठनीय स्ट्रिंग में परिवर्तित करना।

मेरे पास हाल ही में एक मुद्दा था, जहां मैं एक डेटाइम को लाइनक में बदलने की कोशिश कर रहा था, जो मुझे उस समय महसूस नहीं हुआ था, फॉर्मेट अप्रासंगिक था, जब डेटक को लिनक क्वेरी से पास किया गया था।

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

फुल डेटटाइम डॉक्यूमेंटेशन


14

यदि आप इनपुट मान के अनिश्चित हैं तो आप नीचे दिए गए DateTime.TryParseExact () का भी उपयोग कर सकते हैं।

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}

2

इस कोड को स्टैटिक क्लास में रखें> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

इस तरह, आप उपयोग कर सकते हैं

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

2

मुझे बस एक सुंदर तरीका मिला:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

1

दुनिया में विभिन्न संस्कृतियां अलग-अलग तरीकों से तारीख के तार लिखती हैं। उदाहरण के लिए, यूएस में 01/20/2008 जनवरी 20, 2008 है। फ्रांस में यह एक InvalidFormatException फेंक देगा। ऐसा इसलिए है क्योंकि फ्रांस तिथि / समय को दिन / महीना / वर्ष के रूप में पढ़ता है, और अमेरिका में यह महीना / दिन / वर्ष है।

नतीजतन, 20/01/2008 की तरह एक स्ट्रिंग फ्रांस में 20 जनवरी, 2008 को पार्स करेगी, और फिर अमेरिका में एक InvalidFormatException को फेंक देगी।

अपनी वर्तमान संस्कृति सेटिंग्स निर्धारित करने के लिए, आप System.Globalization.CultureInfo.CurrentCulture का उपयोग कर सकते हैं।

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  


-1

क्या आप इसे जल्दी चाहते हैं?

मान लीजिए कि आपके पास प्रारूप yyMMdd के साथ एक तिथि है।

सबसे तेज़ तरीका है इसे बदलने का जो मुझे मिला वह है:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

बस, अपनी पसंद के फॉर्मेट के अनुसार इंडेक्स चुनें। यदि आपको गति की आवश्यकता है, तो शायद आपको फ़ंक्शन के 'गैर-सामान्य' तरीके से कोई आपत्ति नहीं है।

इस विधि में लगभग 10% समय लगता है:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.