5

比如说,我有两个字符串,其中包含任意用户提供的任意文化格式的日期/时间:

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

我可以通过以下方式解析它们:

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

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

4

3 回答 3

1

对于这样的事情,你们怎么看?

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;
}
于 2013-06-20T03:31:06.300 回答
0

您可以尝试对DateTime.ParseExactor使用两个单独的调用DateTime.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.
}

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

于 2013-06-20T02:37:12.657 回答
-1

如果在解析的字符串中未指定时间,TimeOfDay则对象的属性DateTime将设置为午夜 (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对象。显然,如果您在数组中只有一个实体,则它们没有进入任何时间。

于 2013-06-20T02:30:12.807 回答