29 votes

Analyse de DateTime

Je suis en train d'écrire un serveur syslog qui reçoit des messages syslog et les stocke dans une base de données.

Je suis en train d'analyser la date chaîne de caractères reçue dans le message en DateTime de la structure.

Pour les exemples suivants, je vais être en utilisant un trait de soulignement en place d'espaces pour plus de clarté; la les chaînes reçues ont des espaces.

La chaîne que j'ai reçu est dans le format "Jun__7_08:09:10" - veuillez noter que les deux espaces entre le mois et le jour.

Si la journée est après le 10, les cordes deviennent "Jun_10_08:09:10" (un espace).

Si je lis avec:

DateTime.ParseExact(Log.Date, "MMM  d HH:mm:ss", CultureInfo.InvariantCulture);

il travaille pour des chaînes à partir de la 1re à la 9e, mais jette exception de la 10e avant, et si je lis avec un espace, il déclenche une exception sur la 1re à la 9e (et fonctionne à partir de la 10e sur).

Quelle est la bonne façon de convertir cette chaîne?

48voto

Michael Perrenoud Points 37869

Pensez à utiliser cette ligne:

 DateTime.ParseExact(Log.Date,
    "MMM d HH:mm:ss",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AllowWhiteSpaces);
 

Notez que j'ai supprimé l'un des espaces entre le mois et le jour. En effet, AllowWhiteSpaces signifie littéralement:

Spécifie que s peut contenir des espaces blancs de début, d’intérieur et de fin non définis par le format.

23voto

Oded Points 271275

Utilisez la surcharge DateTime.ParseExact qui prend un tableau de chaînes de format:

 DateTime.ParseExact(Log.Date, 
                    new [] {"MMM  d HH:mm:ss", "MMM d HH:mm:ss"}, 
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None);
 

2voto

levelnis Points 3763

Vous pouvez d'abord supprimer l'espace supplémentaire, puis analyser la chaîne:

 DateTime.ParseExact(Log.Date.Replace("  ", " "), "MMM d HH:mm:ss", CultureInfo.InvariantCulture);
 

1voto

JSJ Points 3628

La méthode ParseExect de DateTime a des surcharges où vous pouvez passer plusieurs formats qui pourraient être lus si le précédent ne fonctionne pas. voici un échantillon pour vous ..

 using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                         "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                         "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                         "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                         "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
      string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
                              "5/1/2009 6:32:00", "05/01/2009 06:32", 
                              "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; 
      DateTime dateValue;

      foreach (string dateString in dateStrings)
      {
         try {
            dateValue = DateTime.ParseExact(dateString, formats, 
                                            new CultureInfo("en-US"), 
                                            DateTimeStyles.None);
            Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
         }
         catch (FormatException) {
            Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
         }                                               
      }
   }
}
// The example displays the following output:
//       Converted '5/1/2009 6:32 PM' to 5/1/2009 6:32:00 PM.
//       Converted '05/01/2009 6:32:05 PM' to 5/1/2009 6:32:05 PM.
//       Converted '5/1/2009 6:32:00' to 5/1/2009 6:32:00 AM.
//       Converted '05/01/2009 06:32' to 5/1/2009 6:32:00 AM.
//       Converted '05/01/2009 06:32:00 PM' to 5/1/2009 6:32:00 PM.
//       Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
 

1voto

Lukasz Salamon Points 333
    DateTime.ParseExact(date, "MMM d HH:mm:ss", CultureInfo.InvariantCulture,DateTimeStyles.AllowInnerWhite)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X