如何在使用DateTime进行解析时知道时间部分是否存在

本文关键字:时间部 存在 是否 DateTime | 更新日期: 2023-09-27 18:19:03

假设我有两个字符串,其中包含日期/时间,格式为任意用户提供的任意区域性:

string str1 = "6/19/2013";
string str2 = "6/19/2013 1 am";

我可以这样解析它们:

DateTime dt1 = DateTime.Parse(str1);
DateTime dt2 = DateTime.Parse(str2);

但是我怎么知道时间部分是否存在& &;解析成DateTime对象?

如何在使用DateTime进行解析时知道时间部分是否存在

你们觉得这样的东西怎么样?

public static DateTime ParseDateTimeWithTimeDifferentiation(string str, out bool bOutTimePresent)
{
    //Parse date/time from 'str'
    //'bOutTimePresent' = receives 'true' if time part was present
    DateTime dtRes;
    //Get formats for the current culture
    DateTimeFormatInfo dtfi = CultureInfo.CurrentUICulture.DateTimeFormat;
    DateTimeStyles dts = DateTimeStyles.AllowWhiteSpaces | 
        DateTimeStyles.AssumeLocal;
    //Get all formats
    string[] arrFmts = dtfi.GetAllDateTimePatterns();
    foreach (string strFmt in arrFmts)
    {
        if (DateTime.TryParseExact(str, strFmt, CultureInfo.InvariantCulture, dts, out dtRes))
        {
            //Parsed it!
            //These format codes come from here:
            // http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
            bOutTimePresent = strFmt.IndexOfAny(new char[] { 'H', 'h', 'm', 's', 'f', 'F', 't', 'z' }) != -1;
            return dtRes;
        }
    }
    //As a fall-back, just parse it as-is
    dtRes = DateTime.Parse(str);
    //Assume it has time, as otherwise we'd catch the date-only above
    bOutTimePresent = true;
    return dtRes;
}

您可以尝试使用两个单独的调用DateTime.ParseExactDateTime.TryParseExact。如果您知道日期和时间部分的格式,这将特别容易。代码看起来像这样:

DateTime dateValue;
var culture = new CultureInfo("en-US");
if (DateTime.TryParseExact(dateString, "M/d/yyyy H:mm:ss", culture, 
                       DateTimeStyles.None, out dateValue))) {
     //Using date and time.  dateValue var is set.
}
else if (DateTime.TryParseExact(dateString, "M/d/yyyy", culture, 
                       DateTimeStyles.None, out dateValue))) {
    //Using just date.  dateValue var is set.
}

如果你不能预测日期/时间字符串的确切格式,你可以列举一堆可能的格式,或者使用正则表达式来尝试提取时间部分。在这里阅读更多关于自定义日期和时间格式的信息。还有一些提供的标准日期和时间格式。

如果解析的字符串中没有指定时间,则将DateTime对象的TimeOfDay属性设置为午夜(00:00:00)。然后,您可以使用如下命令检查是否为这种情况:

if (dt1.TimeOfDay.Equals(new TimeSpan(0,0,0))) {
  //do something
} else {
  //do something else
}

编辑:另一种方法是将字符串的日期和时间部分分开。这是假设某种类型的数字日期格式使用破折号、逗号或除空格以外的任何东西来传递。

string[] dateString = str1.Split(' ');
string[] date2String = str2.Split(' ');

现在您将有一个字符串数组,可以很容易地用于检查特殊值。例如,dateString[0]应该包含您的整个日期。dateString[1]及以后可以有任何时间格式,并且可以重新组合并解析为TimeSpan对象。显然,如果数组中只有一个实体,则它们没有输入任何时间