比如说,我有两个字符串,其中包含任意用户提供的任意文化格式的日期/时间:
string str1 = "6/19/2013";
string str2 = "6/19/2013 1 am";
我可以通过以下方式解析它们:
DateTime dt1 = DateTime.Parse(str1);
DateTime dt2 = DateTime.Parse(str2);
但是我怎么知道时间部分是否存在并解析为 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.ParseExact
or使用两个单独的调用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.
}
如果您无法预期日期/时间字符串的确切格式,您可以枚举一堆可能的格式,或者使用正则表达式来尝试提取时间部分。在此处阅读有关自定义日期和时间格式的更多信息。还有一些提供的标准日期和时间格式。
如果在解析的字符串中未指定时间,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
对象。显然,如果您在数组中只有一个实体,则它们没有进入任何时间。