如何判断一个字符串中是否包含日期和时间

11

我正在处理一个项目,其中需要读入两种不同格式的文件,其中一种包含日期和时间,另一种则不包含。

当我读取第一行时,我需要检查字符串是否包含日期和时间,并基于检查结果以特定方式读取文件。

我猜这可能是某种正则表达式,但不知道从哪里开始,并且找不到任何相关信息。

感谢您提供的任何帮助。

更新 我认为我没有很清楚地表达我的问题。当我逐行读取日志文件时,该行可能会出现以下情况:

Col1   Col2  Col3  Col4  Col5 
有时候这条线可能会出现

Col1  17-02-2013 02:05:00 Col2  Col3  Col4  Col5

当我读到这句话时,我需要检查字符串中是否包含日期和时间字符串。


你能分享一下你尝试过什么吗? - spajce
@Boardy:你知道这些潜在日期将以哪种日期时间格式呈现吗?是始终以dd-mm-yyyy hh:mm:ss的格式吗? - bob-the-destroyer
@bob-the-destroyer 格式应始终为 dd-mm hh:mm:ss。我不认为格式会改变(请注意,年份未包括在内)。我之前忘了提到这一点。 - Boardy
@Boardy:在那一列中,你还能找到哪些额外的文本会阻止使用TryParse()将其正确解析为日期时间? - bob-the-destroyer
我想要的是对整个字符串进行检查,以查看它是否包含日期/时间字符串。如果是这样,我会遍历该字符串并将每一列放入一个变量中,包括变量;否则,我会遍历每一列而不必担心日期和时间。否则,我就不知道是否有5列(没有日期)或6列(有日期)。 - Boardy
5个回答

20
如果日期格式已定义,您可以使用正则表达式来解决它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace RegTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string testDate = "3214312402-17-2013143214214";
            Regex rgx = new Regex(@"\d{2}-\d{2}-\d{4}");
            Match mat = rgx.Match(testDate);
            Console.WriteLine(mat.ToString());
            Console.ReadLine();
        }
    }
}

我稍微改进了正则表达式的示例。 - amhed

5

更新2: 发现使用DateTime.TryParseExact比使用正则表达式更好。

DateTime myDate;
if (DateTime.TryParseExact(inputString, "dd-MM-yyyy hh:mm:ss", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate))
{
    //String has Date and Time
}
else
{
    //String has only Date Portion    
}

我认为OP想要检查日期和时间 :) - scartag
如果TryParse失败,DateTime对象将保持默认值(即DateTime.MinValue)。 - amhed
3
如果DateTime.TryParse(x)返回一个布尔值表示是否成功,那么就不需要检查是否小于最小值。也就是说,如果它没有成功,它将始终返回false。 - bob-the-destroyer
谢谢你的帮助。我已经更新了问题,我觉得我没有很清楚地说明需要什么。TryParse不起作用,因为字符串中包含其他与日期和时间无关的内容。 - Boardy
如果文本文件有分隔符(制表符或分号),您可以使用分隔符拆分字符串并执行我指定的操作。如果没有,您需要使用正则表达式。 - amhed
显示剩余2条评论

2
   string s = " Subject: Current account balances for 21st December 2017 and 2nd January 2019 mnmnm ";//here is u r sample string

   s = s.ToLower();
   string newStrstr = Regex.Replace(s, " {2,}", " ");//remove more than whitespace
   string newst = Regex.Replace(newStrstr, @"([\s+][-/./_///://|/$/\s+]|[-/./_///://|/$/\s+][\s+])", "/");// remove unwanted whitespace eg 21 -dec- 2017 to 21-07-2017
   newStrstr = newst.Trim();
   Regex rx = new Regex(@"(st|nd|th|rd)");//21st-01-2017 to 21-01-2017
   string sp = rx.Replace(newStrstr, "");
   rx = new Regex(@"(([0-2][0-9]|[3][0-1]|[0-9])[-/./_///://|/$/\s+]([0][0-9]|[0-9]|[1][0-2]|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|may|june|july|augu|september|october|november|december)[-/./_///:/|/$/\s+][0-9]{2,4})");//a pattern for regex to check date format. For August we check Augu since we replaced the st earlier
   MatchCollection mc = rx.Matches(sp);//look for strings that satisfy the above pattern regex

   List<DateTime> dates=new List<DateTime>(); //Create a list to store the detected dates

   foreach(Match m in mc)
   {
        string s2=Regex.Replace(m.ToString(), "augu", "august");
        dates.Add(DateTime.Parse(s2);
   }

这将从任何状态的字符串中获取日期。 - Arnold_john

-2
使用此方法来检查字符串是否为日期:
private bool CheckDate(String date)
{
    try
    {
        DateTime dt = DateTime.Parse(date);
        return true;
    }
    catch
    {
        return false;
    }
}

2
尽管代码受到赞赏,但它应该始终有相应的解释。这并不需要很长,但是这是期望的。 - peterh
我已经记下了你的建议。谢谢。 - Syed Faizan Ali

-3
这对我们有用:
如果字符串值是有效的日期时间值,则不会引发任何异常:
try
{
    Convert.ToDateTime(string_value).ToString("MM/dd/yyyy");
}

如果字符串值是无效的日期时间值,则会引发异常:
catch (Exception)
{
}

尽管代码受到赞赏,但它应该始终有相应的解释。这并不需要很长,但是这是期望的。 - peterh
我并不是很理解你的意思,如果你能以一种不需要我进行后续修正的方式完成它,那么我会为你点赞。 - peterh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接