C#custom DateTime.ParseExact日期字符串

时间:2017-06-16 11:26:50

标签: c# date datetime

我正在尝试将数据库中的日期解析为DateTime对象。 日期的格式如下:5-5-2017 12:00:00 day-month-year Hour:Mins:seconds

更多日期:

5-5-2017 12:00:00
5-5-2017 12:00:00
19-4-2017 0:00:00
19-4-2017 12:00:00
20-4-2017 0:00:00
20-4-2017 12:00:00
21-4-2017 0:00:00
21-4-2017 12:00:00
22-4-2017 0:00:00
22-4-2017 12:00:00
23-4-2017 0:00:00
23-4-2017 12:00:00
24-4-2017 0:00:00
24-4-2017 12:00:00
19-4-2017 0:00:00

我正在尝试使用以下代码解析它们:

DateTime dt = DateTime.ParseExact(Shift_Data["shift_start_time"].ToString(), "d-M-yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Shift_Data["shift_start_time"]包含日期(单个日期,因为它为每个日期循环一次)

我收到以下错误: Error

有谁知道我做错了什么和/或为什么我的自定义日期字符串错误("d-M-yyyy HH:mm:ss"

提前致谢

3 个答案:

答案 0 :(得分:3)

您的问题是这些日期19-4-2017 0:00:00。它们只有一位数小时,但您的日期字符串d-M-yyyy HH:mm:ss需要两个小时。

改为使用d-M-yyyy H:mm:ss

相关文档:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings#the-h-custom-format-specifier-1

答案 1 :(得分:2)

您的输入中有时只有一个小时的数字:

19-4-2017 0:00:00

但格式

d-M-yyyy HH:mm:ss

总是需要两个小时的数字(HH)。使用

d-M-yyyy H:mm:ss

代替。

答案 2 :(得分:1)

public static DateTime ConvertToDateTime(string input, string[] inputFormats)
{
    string[] formats = null;
    if(inputFormats == null)
    {
        formats = new string[4];
        formats[0] = "d-M-yyyy HH:mm:ss";
        formats[1] = "dd-M-yyyy HH:mm:ss";
        formats[0] = "d-M-yyyy H:mm:ss";
        formats[1] = "dd-M-yyyy H:mm:ss";
    }
    else
    {
        formats = inputFormats;
    }

    DateTime output;
    IFormatProvider provider = new CultureInfo(CultureInfo.CurrentUICulture.LCID, true);
    output = DateTime.ParseExact(input, formats, provider, DateTimeStyles.NoCurrentDateDefault);
    return output;
}

您可以在inputFormats列表中添加要支持的任何格式。还可以根据需要设置文化。

这样打电话:

DateTime dt = ConvertToDateTime(Shift_Data["shift_start_time"].ToString(), null);