2009-05-28 17 views
378

Come si fa a convertire una stringa come 2009-05-08 14:40:52,531 in una DateTime?conversione di una stringa a DateTime

+1

@dban Perché una risposta da '@ CMS' non è contrassegnata come risposta? Potrebbe esserci una ragione: sono curioso – nam

+0

Come convertire gg/mm/aaaa in mm/gg/aaaa? – ragu

+1

@nam Utente cancellato il suo account, o è stato bannato, non può cliccarci sopra né vedere reputazione/medaglie. Purtroppo tutto ciò che possiamo fare è dargli un po 'di pollice in su. – YumeYume

risposta

86

provare questo

DateTime myDate = DateTime.Parse(dateString); 

un modo migliore sarebbe questo:

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

Avete fondamentalmente due opzioni per questo. DateTime.Parse() e DateTime.ParseExact().

Il primo è molto indulgente in termini di sintassi e analizzerà le date in molti formati differenti. È utile per l'input dell'utente che può venire in diversi formati.

ParseExact vi permetterà di specificare il formato esatto della stringa data da utilizzare per l'analisi. È utile usarlo se la tua stringa è sempre nello stesso formato. In questo modo, puoi facilmente rilevare eventuali deviazioni dai dati previsti.

È possibile analizzare l'input dell'utente come questo:

DateTime enteredDate = DateTime.Parse(enteredString); 

Se si dispone di un formato specifico per la stringa, è necessario utilizzare l'altro metodo:

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

"d" stand per il modello di data breve (vedi MSDN for more info) e null specifica che la cultura corrente deve essere utilizzato per l'analisi della stringa.

519

Dal momento che si sta occupando il tempo a base di 24 ore e si dispone di una virgola che separa la frazione secondi, vi consiglio di specificare un formato personalizzato:

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

Buoni occhi. Non ho visto la virgola nell'OP. –

+0

(Penso che intendevi usare una virgola nelle stringhe di data e di formato, però, giusto?) –

+0

Modificato ... Sì, questo è quello che intendevo ... – CMS

14
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); 
+0

Hai perso la parte del tempo? Ho bisogno sia della data che dell'ora, come posso farlo? –

18

provare il sottostante, dove strDate è tua data in formato 'gg/MM/yyyy'

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

Nessuno ha detto che funziona solo con quel particolare formato. –

13

si potrebbe anche usare DateTime.TryParseExact() come di seguito se non si è sicuri del valore di input.

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 
} 
22

Nessuno sembra aver implementato un metodo di estensione. Con l'aiuto di @CMS's answer:

di lavoro e una migliore esempio sorgente completo è qui: Gist Link

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))); 
     } 
    } 
} 
8

uso DateTime.Parse (stringa)

DateTime l_dateTime= DateTime.Parse(dateTimeStr); 
1

Ho appena ricevuto e ho sempre utilizzare

inserire questo codice in una classe statica> 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(); 
    } 
} 

In questo modo , puoi usare

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('-', ':', '-'); 

Tutti gli importi di cui sopra sono testati

0

diverse culture nel mondo stringhe di data di scrittura in modi diversi. Ad esempio, negli Stati Uniti il ​​20 gennaio 2008 è il 20 gennaio 2008. In Francia, questo genererà un'eccezione InvalidFormatException. Questo perché la Francia legge le date come giorno/mese/anno e negli Stati Uniti è mese/giorno/anno.

Di conseguenza, una stringa come 20/01/2008 analizzerà il 20 gennaio 2008 in Francia e quindi genererà una InvalidFormatException negli Stati Uniti.

Per determinare le impostazioni cultura correnti, è possibile utilizzare 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); 
Problemi correlati