从C#中的字符串获取所有日期#

问题描述:

我正在使用基于Web的DOTNET应用程序,其中有数据库中的日志列,每当用户在UI上的注释textarea中添加注释时,日期,他的名字以及注释都是附加到数据库中的现有数据。以下是列有数据的格式:从C#中的字符串获取所有日期#

04/05/11 17:10:19 (user2):Work Log - 
Closing. 
03/31/11 09:40:02 (user2):Work Log - 
Support provided over phone. 
03/31/11 09:39:43 (user1):Work Log – 
Awaiting support reply 
03/30/11 11:30:08 (user2):Work Log - 
Manager notified by standard e-mail communication. 
03/30/11 11:29:30 (user1):Work Log - 
Emailed support team 
03/30/11 11:28:52 (user1):Work Log - 
I have an issue with my Xbox. 

我想现在拉这些注释时输入的所有日期(只是日期)。我尝试了很多选择,但都没有帮助。

+0

这难道不是乞求'fldDateTime | fldUser | fldMessage' –

+0

你检索它作为一个巨大的字符串或者是根据注释单字符串?你究竟做了什么?如何获取每隔一行的前17个字符的子字符串? – StaWho

+0

@StaWho我一次性提取完整的字符串,我不能通过备用行,因为评论可能是多行的机会。 – TRR

假设你想这样做,在C#代码:

Regex splitter = new Regex("[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}"); 
foreach (Match m in splitter.Matches(theDatabaseValue)) { 
    string dateString = m.Groups[0].Value; 
    DateTime dt = DateTime.ParseExact(dateString, "MM/dd/yy HH:mm:ss", null); 
} 

对正则表达式的方法的好处是,你可以扩展它也提取用户:

Regex splitter = new Regex("(?<date>[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) \\((?<user>.+)\\)"); 
foreach (Match m in splitter.Matches(theDatabaseValue)) { 
    string dateString = m.Groups["date"].Value; 
    DateTime dt = DateTime.ParseExact(dateString, "MM/dd/yy HH:mm:ss", null); 
    string user = m.Groups["user"].Value; 
    Console.WriteLine("{0} {1}", dt.ToString(), user); 
} 

,因此,即使该消息(我没有做过正则表达式的那部分,因为我不确定在消息前是否有换行符,看起来像是这样)。

完成此操作后,您可以创建一个包含三列,日期,用户,评论的数据库表,然后使用正则表达式将现有表转换为该表,并使您的未来生活更轻松!

+0

修正日期格式的代码:根据OP示例是月/日/年 –

+0

像魅力一样工作......使用正则表达式只是我现在的选择。非常感谢Andy – TRR

您应该重构数据库以将数据存储在三列(DateTime,User,Comment)中,这将大大提高性能和可用性。

但是,如果这不是一个选项,您可以使用DateTime.TryParse从字符串中获取值。例如:

 string comment = "04/05/11 17:10:19 (user2):Work Log - Closing."; 

     string dateSection = comment.Substring(0, 17); 

     DateTime date; 

     if (!DateTime.TryParse(dateSection, out date)) 
     { 
      throw new Exception(string.Format("unable to parse string '{0}'", dateSection)); 
     }