Conversion d'une chaîne en DateTime

591

Comment convertissez-vous une chaîne telle que 2009-05-08 14:40:52,531dans un DateTime?

cramopy
la source
2
@dban Pourquoi une réponse de @CMSnon marquée comme réponse? Il peut y avoir une raison - je suis curieux.
nam
5
@nam L'utilisateur a supprimé son compte ou a été banni, ne peut pas cliquer dessus ni voir sa réputation / médailles. Malheureusement, tout ce que nous pouvons faire est de lui donner un coup de pouce.
YumeYume

Réponses:

754

Étant donné que vous gérez le temps sur 24 heures et que vous avez une virgule séparant la fraction de secondes, je vous recommande de spécifier un format personnalisé:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);
CMS
la source
4
Bons yeux. Je n'ai pas vu la virgule dans le PO.
lc.
(Je pense que vous vouliez utiliser une virgule dans les chaînes de date et de format, n'est-ce pas?)
lc.
1
Il s'agit uniquement d'une virgule en raison du paramètre OPs European Locale, que se passe-t-il si vous apportez ce code à un autre serveur avec un US.Locale, les fractions d'une section seront une décimale et non une virgule sur la chaîne enregistrée, et votre solution Pause. Assurez-vous d'ajouter une vérification pour le type de chaîne datetime entrante pour ses paramètres régionaux corrects avant d'appliquer le bon analyseur. Je suis surpris que Microsoft n'ait pas déjà ce code pré-construit ailleurs dans le CLR ou C # .net
hamish
impossible de convertir ceci en chaîne d'heure de date MyString = "06/22/1916 3:20:14 PM";
Vinod Kumar
L'heure sur 24 heures et la virgule comme séparateur décimal ne sont pas des paramètres régionaux personnalisés. Il ne devrait pas avoir besoin d'être manipulé spécialement.
jpaugh
248

Vous avez essentiellement deux options pour cela. DateTime.Parse()et DateTime.ParseExact().

Le premier est très indulgent en termes de syntaxe et analysera les dates dans de nombreux formats différents. Il est bon pour les entrées utilisateur qui peuvent se présenter sous différents formats.

ParseExact vous permettra de spécifier le format exact de votre chaîne de date à utiliser pour l'analyse. Il est bon de l'utiliser si votre chaîne est toujours au même format. De cette façon, vous pouvez facilement détecter tout écart par rapport aux données attendues.

Vous pouvez analyser les entrées utilisateur comme ceci:

DateTime enteredDate = DateTime.Parse(enteredString);

Si vous avez un format spécifique pour la chaîne, vous devez utiliser l'autre méthode:

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

"d"représente le modèle de date courte (voir MSDN pour plus d'informations ) et nullspécifie que la culture actuelle doit être utilisée pour analyser la chaîne.

Sander
la source
137

essaye ça

DateTime myDate = DateTime.Parse(dateString);

une meilleure façon serait la suivante:

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

Utilisation DateTime.Parse(string):

DateTime dateTime = DateTime.Parse(dateTimeStr);
Amir Touitou
la source
26

Personne ne semble avoir implémenté une méthode d'extension. Avec l'aide de la réponse de @ CMS :

Voici un exemple complet et amélioré de source complète: 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)));
        }
    }
}
guneysus
la source
Nobody seems to implemented an extension methodpeut-être parce que pas nécessaire ...
Yousha Aleayoub
Parfois, la bibliothèque standard ne correspond pas à nos besoins. Et c'est pourquoi besoin / utilisation de bibliothèques d'assistance. En utilisant la méthode de la méthode d'extension, ou une API fluide, c'est plutôt la FP qui préfère la POO ou vice versa. Ni correct ni faux. C'est un choix. @YoushaAleayoub
guneysus
23

J'ai essayé de différentes manières. Ce qui a fonctionné pour moi, c'est ceci:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data pour moi c'était des moments comme ça 24/09/2017 09:31:34

zeilja
la source
Semble mieux, peut attribuer sa valeur à la variable DateTime?
Birhan Nega
20

Essayez ci-dessous, où strDate est votre date au format «MM / jj / aaaa»

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
Krishna
la source
1
Personne n'a mentionné qu'il ne fonctionne qu'avec ce format particulier.
T.Todua
Dommage ... 🙂 Les codeurs pensent toujours que leurs collègues codeurs trouveront ... Une bonne chose en fait ... Faites-nous réfléchir davantage ...
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);
Umair Baig
la source
1
Vous avez manqué la partie temps? J'ai besoin de la date et de l'heure, comment faire?
Badhon Jain
15

DateTime.Parse

Syntaxe:

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

Exemple:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Valeur: représentation sous forme de chaîne de la date et de l'heure.
  • Fournisseur: objet qui fournit des informations spécifiques à la culture.
  • Styles: options de formatage qui personnalisent l'analyse des chaînes pour certaines méthodes d'analyse de la date et de l'heure. Par exemple, AllowWhiteSpaces est une valeur qui aide à ignorer tous les espaces présents dans la chaîne pendant son analyse.

Il convient également de se rappeler que DateTime est un objet qui est stocké sous forme de nombre en interne dans le cadre, Format ne s'applique à lui que lorsque vous le reconvertissez en chaîne.

  • Analyser la conversion d'une chaîne en type de numéro interne.

  • Formatage convertissant la valeur numérique interne en une chaîne lisible.

J'ai récemment eu un problème où j'essayais de convertir un DateTime pour passer à Linq ce que je n'avais pas réalisé à l'époque était que le format n'était pas pertinent lors du passage de DateTime à une requête Linq.

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

Documentation complète de DateTime

Mr.B
la source
14

Vous pouvez également utiliser DateTime.TryParseExact () comme ci-dessous si vous n'êtes pas sûr de la valeur d'entrée.

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
}
dev.bv
la source
2

Mettez ce code dans une classe statique> 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();
   }
}

De cette façon, vous pouvez utiliser

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('-', ':', '-');
MRT2017
la source
2

Je viens de trouver une manière élégante:

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"
guneysus
la source
1

Différentes cultures dans le monde écrivent des chaînes de dates de différentes manières. Par exemple, aux États-Unis, le 20/01/2008 est le 20 janvier 2008. En France, cela déclenchera une exception InvalidFormatException. En effet, la France lit les dates-heures comme Jour / Mois / Année et aux États-Unis, c'est Mois / Jour / Année.

Par conséquent, une chaîne comme 20/01/2008 sera analysée jusqu'au 20 janvier 2008 en France, puis lèvera une InvalidFormatException aux États-Unis.

Pour déterminer vos paramètres de culture actuels, vous pouvez utiliser 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);  
Saeed Dini
la source
1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

celui-ci vous donne

2019-08-17 11:14:49.000
Abdulhakim Zeinu
la source
-1

Voulez-vous que ce soit rapide?

Supposons que vous ayez une date au format aaaMJj.

Le moyen le plus rapide de le convertir que j'ai trouvé est:

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

Choisissez simplement les index en fonction du format de date de votre choix. Si vous avez besoin de vitesse, cela ne vous dérange probablement pas de la manière «non générique» de la fonction.

Cette méthode prend environ 10% du temps requis par:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
David
la source