Conversione di una stringa in DateTime


591

Come si converte una stringa come 2009-05-08 14:40:52,531in a DateTime?


2
@dban Perché una risposta da @CMSnon contrassegnata come risposta? Potrebbe esserci una ragione: sono curioso.
nam

5
@nam L'utente ha eliminato il suo account o è stato bannato, non può fare clic su di esso né vedere reputazione / medaglie. Purtroppo tutto ciò che possiamo fare è dargli un pollice in su.
YumeYume,

Risposte:


754

Dato che stai gestendo un orario basato su 24 ore e hai una virgola che separa la frazione di secondi, ti 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);

4
Buoni occhi. Non ho visto la virgola nell'OP.
lc.

(Penso che volevi usare una virgola nelle stringhe di data e formato, giusto?)
LC.

1
È solo una virgola a causa delle impostazioni locali europee dei PO, cosa succede se si porta quel codice su un altro server con un US.Locale, quindi le frazioni di una sezione saranno un decimale e non una virgola sulla stringa salvata, e la soluzione sarà rompere. Assicurati di aggiungere un segno di spunta per il tipo di stringa datetime in entrata per le impostazioni internazionali corrette prima di applicare il parser corretto. Sono sorpreso che Microsoft non abbia già questo codice pre-costruito da qualche altra parte nel CLR o in C # .net
hamish

impossibile convertire questo nella stringa di data e ora MyString = "22/06/1916 15:20:14 PM";
Vinod Kumar,

Le 24 ore e la virgola come separatore decimale non sono impostazioni internazionali personalizzate. Non dovrebbe essere necessario gestirlo in modo speciale.
jpaugh

248

Hai sostanzialmente due opzioni per questo. DateTime.Parse()e DateTime.ParseExact().

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

ParseExact ti consentirà di specificare il formato esatto della stringa di date da utilizzare per l'analisi. È utile utilizzarlo se la stringa è sempre nello stesso formato. In questo modo, è possibile rilevare facilmente eventuali deviazioni dai dati previsti.

È possibile analizzare l'input dell'utente in questo modo:

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"indica il modello di data breve (vedere MSDN per ulteriori informazioni ) e nullspecifica che la cultura corrente deve essere utilizzata per l'analisi della stringa.


137

prova questo

DateTime myDate = DateTime.Parse(dateString);

un modo migliore sarebbe questo:

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


26

Nessuno sembra implementare un metodo di estensione. Con l'aiuto della risposta di @ CMS :

L'esempio completo e funzionante della fonte completa è 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)));
        }
    }
}

Nobody seems to implemented an extension methodforse perché non necessario ...
Yousha Aleayoub,

A volte la libreria standard non soddisfa i nostri bisogni. Ed è per questo che è necessario / utilizzare librerie di supporto. Usando il metodo del metodo di estensione, o API fluente, preferisci un pò preferire FP a OOP o viceversa. Né corretto né sbagliato. È una scelta. @YoushaAleayoub
guneysus,

23

Ho provato in vari modi. Ciò che ha funzionato per me è stato questo:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data per me sono stati momenti come questo 24/09/2017 9:31:34


Sembra migliore, può assegnare il suo valore alla variabile DateTime?
Birhan Nega,

20

Prova di seguito, dove strDate è la tua data nel formato 'MM / gg / aaaa'

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

1
Nessuno ha detto che funziona solo con quel particolare formato.
T.Todua,

Peccato ... 🙂 I programmatori pensano sempre che i compagni programmatori capiranno ... Buona cosa in realtà ... Facci pensare di più ...
Krishna,


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
Ti sei perso la parte del tempo? Ho bisogno sia della data che dell'ora, come posso farlo?
Badhon Jain,

15

DateTime.Parse

Sintassi:

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

Esempio:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Valore: rappresentazione in formato stringa di data e ora.
  • Provider: oggetto che fornisce informazioni specifiche sulla cultura.
  • Stili: opzioni di formattazione che personalizzano l'analisi delle stringhe per alcuni metodi di analisi della data e dell'ora. Ad esempio, AllowWhiteSpaces è un valore che aiuta a ignorare tutti gli spazi presenti nella stringa mentre analizza.

Vale anche la pena ricordare che DateTime è un oggetto memorizzato come numero internamente nel framework, il formato si applica solo ad esso quando lo si converte nuovamente in stringa.

  • Analisi convertendo una stringa nel tipo di numero interno.

  • Formattazione convertendo il valore numerico interno in una stringa leggibile.

Di recente ho avuto un problema in cui stavo cercando di convertire un DateTime per passare a Linq ciò che non avevo realizzato al momento era il formato è irrilevante quando si passa DateTime a una query Linq.

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

Documentazione completa di DateTime


14

È inoltre possibile utilizzare 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
}

2

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

2

Ho appena trovato un modo elegante:

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

Culture diverse nel mondo scrivono stringhe di date in modi diversi. Ad esempio, negli Stati Uniti il ​​20/01/2008 è il 20 gennaio 2008. In Francia ciò genererà un InvalidFormatException. Questo perché la Francia legge le date come giorno / mese / anno e negli Stati Uniti è mese / giorno / anno.

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

Per determinare le impostazioni di 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);  

1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

questo ti dà

2019-08-17 11:14:49.000

-1

Lo vuoi in fretta?

Supponiamo che tu abbia una data con il formato yYMMdd.

Il modo più veloce per convertirlo che ho trovato è:

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')

Basta scegliere gli indici in base al formato data desiderato. Se hai bisogno di velocità, probabilmente non ti dispiace il modo "non generico" della funzione.

Questo metodo richiede circa il 10% del tempo richiesto da:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.