Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 日期时间分析_C#_Parsing_Datetime - Fatal编程技术网

C# 日期时间分析

C# 日期时间分析,c#,parsing,datetime,C#,Parsing,Datetime,我正在编写一个syslog服务器,它接收syslog消息并将它们存储在数据库中 我试图将消息中接收到的日期字符串解析为DateTime结构 对于以下示例,为了清晰起见,我将使用下划线代替空格;收到的实际字符串有空格 我收到的字符串格式为“Jun\uu 7\u 08:09:10”-请注意月份和日期之间的两个空格 如果日期在10号之后,字符串将变成“Jun\u 10\u 08:09:10”(一个空格) 如果我使用以下命令进行分析: DateTime.ParseExact(Log.Date, "MMM

我正在编写一个syslog服务器,它接收syslog消息并将它们存储在数据库中

我试图将消息中接收到的日期字符串解析为
DateTime
结构

对于以下示例,为了清晰起见,我将使用下划线代替空格;收到的实际字符串有空格

我收到的字符串格式为“Jun\uu 7\u 08:09:10”-请注意月份和日期之间的两个空格

如果日期在10号之后,字符串将变成
“Jun\u 10\u 08:09:10”
(一个空格)

如果我使用以下命令进行分析:

DateTime.ParseExact(Log.Date, "MMM  d HH:mm:ss", CultureInfo.InvariantCulture);
它适用于从1号到9号的字符串,但从10号开始抛出异常,如果我用一个空格进行解析,它会在1号到9号抛出异常(从10号开始)

解析此字符串的正确方法是什么?

使用接受格式字符串数组的重载:

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

考虑使用这一行:

DateTime.ParseExact(Log.Date,
    "MMM d HH:mm:ss",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AllowWhiteSpaces);
请注意,我删除了月份和日期之间的一个空格。这是因为
AllowWhiteSpaces
字面意思是:

指定s可以包含未按格式定义的前导空格、内部空格和尾随空格


您可以先删除多余的空间,然后解析字符串:

DateTime.ParseExact(Log.Date.Replace("  ", " "), "MMM d HH:mm:ss", CultureInfo.InvariantCulture);
DateTime的方法有一些重载,您可以在其中传递多个格式,如果前面的格式不起作用,则可以读取这些格式。这是给你的样品

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.

我记得,ParseExact可以提供多种格式,而不是一种,您可以尝试提供低于1位和2位的格式。但是可能存在一些格式,比如
mmmdd HH:mm:ss
(用d代替空格),但我不确定。使用
d
代替
dd
,有什么具体原因吗?@Quatroking因为月日部分没有前导零。当然,这就是输入。没关系,继续前进!更具体地说,可能只是
allownerwhite
,但是+1,我直到现在都不知道这些选项:)+1-告诉我我应该更仔细地查看
datetimestyle
:)@Rawling,是的
allownerwhite
在这里可能也能很好地工作。@MichaelPerrenoud-确实(在LINQPad上测试过)@Oded,谢谢!你提醒了我多种格式!铁磨铁——这就是它的全部。你知道,这就是为什么我喜欢运动精神徽章,完成这项工作的方法总是不止一种。它不漂亮,也不灵活,但它也能完成需要DateTimeStyles参数的工作。@Tory-True。你的意思是像我例子中的那个?是的,完全像我评论时你例子中没有的那个;P
    DateTime.ParseExact(date, "MMM d HH:mm:ss", CultureInfo.InvariantCulture,DateTimeStyles.AllowInnerWhite)