【问题标题】:Date Time gives error after hosting托管后日期时间出错
【发布时间】: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


【解决方案1】:

如果数据库中的日期是以日期格式存储的,那么你可以这样做:

DateTime d1 = b.dr.GetDateTime(1).Date;
DateTime d2 = System.DateTime.Today;
TimeSpan ts = d2.Subtract(d1);

编辑:

如果字段以日期、日期时间、日期时间2、小日期时间等日期格式存储在数据库中,SqlDataReader.GetDateTime() 方法将获取该值并将其转换为 .Net DateTime 值。将日期值表示为这些专门的日期数据类型时,操作它们通常更方便。

日期字符串的问题在于,有时它们可​​以有多种解释。然而,专门的日期格式都有特定的和明确定义的解释。但是,如果您尝试将日期/时间值转换为字符串表示或从字符串表示转换,您可能会再次遇到格式问题。只要您可以避免此类转换,无论服务器中的日期时间设置如何,一切都会很好。

如果数据库中的字段没有时间组件(如果数据库数据类型是 DATE 而不是 DATETIME),您可以省略第一行的 .Date 部分并执行以下操作:

DateTime d1 = b.dr.GetDateTime(1);
DateTime d2 = System.DateTime.Today;
TimeSpan ts = d2.Subtract(d1);

【讨论】:

  • 你显然是在正确的轨道上,但你根本没有解释清楚。您应该让 OP 知道为什么会这样。
  • 工作完美......但是如何以及为什么?无论服务器中的日期时间设置如何,它都能正常工作吗?
【解决方案2】:

你的数据库字段类型是什么? 假设它是datetime。目前还不清楚你为什么要在它上面做ToString() 来立即解析字符串。 ParseExact 正是这样做的。您正在寻找的格式应该完全匹配。它与添加到字符串中的“::::...”格式不匹配。此外,ToString() 使用的当前文化可能在服务器上有所不同,因此您再次请求ParseExact 中的格式可能不匹配。

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 2012-06-29
    • 1970-01-01
    • 2014-10-13
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多