在我的数据库中,我的字段日期类型为 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);
是否有任何可用的C#方法允许我在不编写所有代码的情况下执行此转换?
答案 0 :(得分:10)
绝对 - 使用DateTime.ParseExact
:
DateTime parsed = DateTime.ParseExact(text, "yyyyMMddHHmm",
CultureInfo.InvariantCulture);
请注意HH
24小时而不是hh
12小时格式。
或者,您可以使用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...
}
或者对于“只是抛出异常”行为,只需无条件地使用parseResult.Value
。
编辑:顺便说一下,有没有理由为什么你在varchar列中存储日期?你可以修改你的架构吗?
答案 1 :(得分:4)
您可以使用DateTime.ParseExact方法。
答案 2 :(得分:2)
根据我在论坛上发现的内容,以下内容应该有效(我自己没有测试过......)
string dateString = "20060425185231";
DateTime myDate;
myDate = DateTime.ParseExact(dateString,"yyyyMMddHHmmss", new DateTimeFormatInfo());
MessageBox.Show(myDate.ToString());
答案 3 :(得分:2)
试试这个:
string dateString;
string format;
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
dateString = "201202130955";
format = "yyyyMMddhhmm"
result = DateTime.ParseExact(dateString, format, provider);