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

Use DateTime.TryParseExact to format date string and ignore time

我想将字符串日期解析为 DateTime 但忽略时间。 我期望的日期格式是 M/d/yyyy,即 3/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); 

有什么方法可以解析只有特定日期格式而忽略时间的日期字符串吗?

如果您总是只想解析日期部分,可以通过明确确保字符串的长度仅为 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.
}

您可以从输入字符串中去除时间部分,或仅使用 .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);

就我个人而言,我会选择第一个选项。

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 属性.

仅获取日期部分