【发布时间】:2016-10-19 13:32:44
【问题描述】:
我在 MSSQL DB 中有一个列,它存储了以下日期:
2016-06-10 10:55:00.000
我在前端使用数据读取器调用此列,然后将其解析为特定格式,然后与其他日期进行比较以查找时间戳。 问题是当我从 Visual Studio 运行它时,它工作正常。但是当我在实时服务器上上传它时,我得到了以下异常:
2016 年 6 月 10 日上午 10:55:00 ::: d1 ::: :: System.FormatException: String was 未被识别为有效的日期时间。在 System.DateTimeParse.ParseExact(String s, 字符串格式, DateTimeFormatInfo dtfi,DateTimeStyles 样式)在 login.btn_login_Click(Object sender, EventArgs e)
以下是我的代码:
tst = b.dr.GetValue(1).ToString() + " ::: d1 ::: ";
DateTime d1 = DateTime.ParseExact(b.dr.GetValue(1).ToString(), "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture);
tst = "d2";
DateTime d2 = DateTime.ParseExact(System.DateTime.Now.ToString(), "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture);
tst = "d3";
TimeSpan ts = d2.Subtract(d1);
tst = "d4";
我也试过了:
DateTime d1 = DateTime.ParseExact(b.dr.GetValue(1).ToString(), "dd-MM-yyyy", null);
它仍然无法在实时服务器上运行。 也试过了:
DateTime d1 = DateTime.ParseExact(b.dr.GetValue(1).ToString(), "dd-MM-yyyy HH:mm:ss", null);
DateTime d2 = DateTime.ParseExact(System.DateTime.Now.ToString(), "dd-MM-yyyy HH:mm:ss", null);
但也难怪。 作为一个实时服务器,它需要完全独立于系统文化,并且应该在客户端在其操作系统中选择的所有日期时间格式下工作。
注意:在开发端,我使用的是 MSSQL R2 2008 Express,而实时服务器使用的是 MSSQL 2012。
【问题讨论】:
-
这是否发生在代码的第一行:tst = b.dr.GetValue(1).ToString() + " ::: d1 ::: ";?我还假设 'tst' 是一个字符串?
-
异常文本中的日期看起来只有一位数字,以
/分隔,并包含AM/PM。您指定的格式需要 2 天数字和-分隔符。 -
错误消息指出字符串 '6/10/2016 10:55:00 AM ::: d1 :::' 未被识别为有效的 DateTime。唯一一次创建带有 '::: d1 :::' 的字符串是在您向我们展示的第一行代码中。 'tst' 是 DateTime 类型吗?
-
请注意,每当您看到日期时,您不会看到值,而是看到它的字符串表示。您在 MS-SQL 中看到的格式以及您在其他地方看到的格式是一种文化依赖转换。每当您想跨境发送数据时,您应该确保您使用的是独立格式。最好的是 ISO8601,在你的情况下是
2016-06-10T10:55:00.000(如果06表示六月!!)。 -
我刚刚看到,您正试图用
dd-MM-yyyy解析6/10/2016。这是 - 至少 - dm/md 混淆 的严重迹象
标签: c# .net sql-server datetime