在C#中将字符串(yyyyMMddhhmm)转换为DateTime的函数

Cic*_*ami 3 c# string datetime

在我的数据库中,我有一个类型为varchar的字段日期,其中日期以yyyyMMddhhmm格式存储,没有空格或其他字符将它们分开.

现在我需要将此日期与C#DateTime进行比较,因此我需要将字符串转换为DateTime.我能想到的最合乎逻辑的方法是从变量中提取date与年,月和日相关的子字符串并创建一个新的DateTime对象:

var year = Convert.ToInt32(date.Substring(0, 4));

var month = Convert.ToInt32(date.Substring(4, 2));

var day = Convert.ToInt32(date.Substring(6, 2));

DateTime dateToCompare = new DateTime(year, month, day);
Run Code Online (Sandbox Code Playgroud)

是否有任何可用的C#方法允许我在不编写所有代码的情况下执行此转换?

Jon*_*eet 10

绝对 - 使用DateTime.ParseExact:

DateTime parsed = DateTime.ParseExact(text, "yyyyMMddHHmm",
                                      CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

请注意HH24小时而不是hh12小时格式.

或者,您可以使用DateTime.TryParseExact,它返回true/false值以指示解析是否成功.如果您完全期望所有数据都是有效的,并且以其他方式抛出异常是合理的,那么DateTime.ParseExact就可以了.

作为一个非常不同的替代方案,您可以使用Noda Time:

// Do this once...
var pattern = LocalDateTimePattern.CreateWithInvariantInfo("yyyyMMddHHmm");

// Do this repeatedly...
var parseResult = pattern.Parse(text);
if (parseResult.Success)
{
    LocalDateTime value = parseResult.Value;
    // Use the value...
}
else
{
    // Error... 
}
Run Code Online (Sandbox Code Playgroud)

或者对于"只是抛出异常"行为,只需parseResult.Value无条件使用.

编辑:顺便说一句,没有任何理由为什么你存储日期varchar列?你可以修改你的架构吗?