如何验证“日期和时间”字符串只有时间

本文关键字:时间 日期和时间 字符串 日期 何验证 验证 | 更新日期: 2023-09-27 18:08:40

我有一个字符串变量,可以存储完整日期或部分日期:

1)日期:12/12/2010 12:33 AM

2)部分日期:12:33 AM(没有日期字段只有时间)

我想弄清楚什么是解析字符串的最佳方法,以确定字符串是否缺少日期字符串。原因是,在我的代码中,如果缺少日期,我将向字符串附加一个默认日期(例如1/1/1900)。请记住,时间可以是多种格式。

更新-我对这个问题的特殊答案。

正如所有的"帖子"所述,这个问题有多种答案,这是我最终使用的,希望它能帮助别人*:

public DateTime ProcessDateAndTime(string dateString)
{
    string dateAndTimeString = dateString;
    string[] timeFormats = new string[]
    {
        "hh:mm tt", "hh:mm:ss tt",
        "h:mm tt", "h:mm:ss tt", 
        "HH:mm:ss", "HH:mm", "H:mm"
    };
    // check to see if the date string has a time only
    DateTime dateTimeTemp;
    if (DateTime.TryParseExact(dateString, timeFormats,
        CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None, out dateTimeTemp))
    {
        // setting date to 01/01/1900
        dateAndTimeString = new DateTime(1900, 1, 1).ToShortDateString() + " " + dateString;
    }
    return DateTime.Parse(dateAndTimeString);
}

*注意:此方法是基于这样的假设:在您的应用程序中只使用特定数量的时间格式,并保证传入正确格式的日期和时间或时间字符串(删除垃圾文本的预验证)。

如何验证“日期和时间”字符串只有时间

使用

Convert.ToDateTime(string value, IFormatProviderProvider provider)

由于字符串有不同的风格,因此根据需要提供不同的格式提供程序。

顺序可以是:

  • DateOnly
  • 时间只有
  • DateTime

如果转换失败,将抛出格式异常。如果不希望有异常,可以使用Datetime.TryParse,因为它返回一个布尔值。

根据字符串的表示方式,你可以有3个以上的格式提供程序

您可以尝试使用RegEx验证字符串,顺便说一句,DateTime验证的良好正则表达式可以在这里找到

有一种方法可以在不知道所有可能的时间格式的情况下做到这一点:

CultureInfo provider = CultureInfo.CurrentCulture;
DateTime time;
DateTime datetime;
bool isTime = DateTime.TryParse(dateString, provider, DateTimeStyles.NoCurrentDateDefault, out time) 
            && time.Date == DateTime.MinValue.Date
            && DateTime.TryParse(dateString, provider, DateTimeStyles.None, out datetime) 
            && datetime.Date != DateTime.MinValue.Date);

如果字符串只有时间,那么第一个TryParse将把日期部分设置为1/1/0001或DateTime.MinValue.Date,第二个TryParse将把日期部分设置为当前日期。除非在穿越回0001年1月1日之后由神秘博士运行,否则这将有效。

可以使用DateTime.TryParseExact.

这可能不是最好的但它回答了你的问题:

    string dateString = "9:53AM";
    if (!dateString.Contains('/')))
    {
        dateString = DateTime.Now.ToShortDateString() + " " + dateString;
    }

查看字符串的长度将是直接的,并且将支持多种格式。带有日期和时间的字符串肯定会比只有时间的字符串长。但是,如果您的输入可能具有高精度(12:30:30:50:20 vs 12/11/11 12:30)和低精度的时间,这将不起作用。

如果您不需要立即知道字符串中的值,而只想添加默认日期,则此解决方案是理想的。

如果你支持以秒为单位的时间,例如,时间将有8个或更少的字符,日期时间将有9个或更多的字符。

考虑到时间可以采用各种格式(12/24?),最好使用几种模式,按照某种预定义的顺序,尝试使用每种模式进行解析,并在第一个模式成功时进行解析。

你也可以试试

DateTime aTime;
if (DateTime.TryParse(dateString, CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.NoCurrentDateDefault, out aTime))
{
    //if the there is no date part in the dateString, date will
    // default to Gregorian 1/1/0001
}