如何在使用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对象?
你们觉得这样的东西怎么样?
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
或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.
}
如果你不能预测日期/时间字符串的确切格式,你可以列举一堆可能的格式,或者使用正则表达式来尝试提取时间部分。在这里阅读更多关于自定义日期和时间格式的信息。还有一些提供的标准日期和时间格式。
如果解析的字符串中没有指定时间,则将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
对象。显然,如果数组中只有一个实体,则它们没有输入任何时间