C# 日期时间分析
我正在编写一个syslog服务器,它接收syslog消息并将它们存储在数据库中 我试图将消息中接收到的日期字符串解析为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
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)