使用DateTime.TryParseExact格式化日期字符串并忽略时间

时间:2018-09-18 17:50:26

标签: c# .net datetime datetime-format

我想将字符串日期解析为DateTime,但忽略时间。 我的预期日期格式为M/d/yyyy3/29/2018(前导零)。 问题是字符串可以有时间也可以没有时间,时间可以有我无法预测的不同格式。

var inputDateString = "12/31/2017 12:00:00 AM" // false, but I want to parse
var inputDateString = "12/31/2017" // true
DateTime.TryParseExact(inputDateString, "M/d/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate); 

是否可以解析仅具有特定日期格式的日期字符串并忽略时间?

3 个答案:

答案 0 :(得分:2)

TryParseExact的重载允许您以多种格式传递。如果您事先知道需要哪种格式,则可以使用以下重载:

void Main()
{
    string[] validFormats = {"M/d/yyyy", "M/d/yyyy hh:mm:ss tt"};

    var inputDateString1 = "12/31/2017 12:00:00 AM"; // false, but I want to parse
    var inputDateString2 = "12/31/2017"; // true

    DateTime.TryParseExact(inputDateString1, validFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt1);
    DateTime.TryParseExact(inputDateString2, validFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt2);

}

然后,您可以使用Date属性获取日期部分。

答案 1 :(得分:1)

如果您始终只想解析日期部分,可以通过明确确保字符串长度只有10个字符来完成。这是一个令人费解的示例,但是您可以剔除不需要的内容,您就会明白:

var inputDateString = "12/31/2017 12:00:00 AM";
string datePortion = string.Empty;
DateTime dt;

if (inputDateString.Length>10)
{
    // take first 10 characters of inputDateString
    datePortion = inputDateString.Substring(0, Math.Min(inputDateString.Length, 10));
}
else if (inputDateString.Length==10)
{
    // inputDateString is already 10 characters
    datePortion = inputDateString;
}
else
{
    // inputDateString is less than 10 characters, no date found, do nothing.
}

if(!DateTime.TryParse(datePortion, out dt))
{
   // handle error that occurred, 
}
else
{
    // parse was successful, carry on.
}

答案 2 :(得分:1)

您可以仅使用.Date部分从输入字符串中去除时间部分,或解析完整的输入。

var parsedDate = DateTime.MinValue;
var inputDateString = "12/31/2017 12:00:00 AM"; // false, but I want to parse

// option 1: use only the date part
if (DateTime.TryParseExact((inputDateString ?? "").Split(' ')[0] , "M/d/yyyy", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
    Console.WriteLine(parsedDate);

// option 2: use the full input, but ignore the time
if (DateTime.TryParseExact(inputDateString, "M/d/yyyy hh:mm:ss tt", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
    Console.WriteLine(parsedDate.Date);

我个人会选择第一个选项。