【发布时间】:2021-01-28 23:32:20
【问题描述】:
我有一个包含两个 DateTime 成员的类。
但是,当我尝试将表示日期的“人类可读”值分配给 DateTime 成员时,它会拒绝它并显示消息“字符串未被识别为有效的 DateTime”。
失败的代码行是:
md.BeginDate = DateTime.Parse(reader.GetValue(5).ToString());
在上下文中,显示我尝试从 DateTime 的字符串表示形式转换的值:
根据此处的第一个和接受的答案 [https://stackoverflow.com/questions/2193012/string-was-not-recognized-as-a-valid-datetime-format-dd-mm-yyyy],我也试过这个:
md.BeginDate = DateTime.ParseExact(reader.GetValue(6).ToString(), "MM/dd/yyyy", null);
...但同样可耻的结果。
更新
基于this,我尝试了以下方法:
CultureInfo provider = CultureInfo.InvariantCulture;
string format = "yyyy-MM-dd HH:mm:ss.ffffff";
. . .
DateTime.ParseExact(dateString, format, provider);
...但得到相同的结果。
“dateValAsStr”的值为2021-01-21 11:25:56.9608384
更新 2
事实证明,这是我的一个非常愚蠢的疏忽。当我单步执行时,我看到数据库中的 Date (TEXT) 值是空的。所以这段代码“有效”(不抛出异常):
CultureInfo provider = CultureInfo.InvariantCulture;
string format = "yyyy-MM-dd HH:mm:ss.fffffff";
. . .
string qry = "SELECT LocationName, Address1, City, StateOrSo, PostalCode, " +
"BeginDate, EndDate, MapDetailNotes, Latitude, Longitude " +
"FROM CartographerDetail " +
"WHERE FKMapName = @FKMapName";
. . .
dateValAsStr = reader.GetValue(5).ToString().Trim();
if (! String.IsNullOrWhiteSpace(dateValAsStr))
{
md.BeginDate = DateTime.ParseExact(dateValAsStr, format, provider).Date;
}
dateValAsStr = reader.GetValue(6).ToString().Trim();
if (!String.IsNullOrWhiteSpace(dateValAsStr))
{
md.EndDate = DateTime.ParseExact(dateValAsStr, format, provider).Date;
}
【问题讨论】:
-
您要检索的列的类型是什么?如果数据库中已经是日期/时间,使用
md.BeginDate = reader.GetDateTime(5);转换成字符串再解析是自找麻烦。完全避免格式问题。 -
如果我没记错的话,SQLite advises storing dates in ISO-8601 format。如果数据库不遵循该约定,请显示示例数据。
-
好的,所以它遵循约定。尽管它与答案显示的格式不同,但您链接的答案如何没有帮助?我在您的代码中没有看到对
DateTime.ParseExact的调用。 -
解析它 with 时间部分(包括 all 7
f地方...你只有 6 个地方),然后取Date结果的属性来删除时间部分。 -
你不需要 ParseExact,Parse 就足够了:
var date = DateTime.Parse("2021-01-21 11:25:56.9608384", CultureInfo.InvariantCulture);
标签: c# datetime datetime-format