我在 MSSQL DB 中有一列存储了以下日期:
2016-06-10 10:55:00.000
我在前端使用 DataReader 调用此列,然后将其解析为特定格式,然后与其他日期进行比较以查找时间戳。 问题是当我从 Visual Studio 运行它时,它工作正常。但是当我将它上传到实时服务器时,出现以下异常:
6/10/2016 10:55:00 AM ::: d1 ::: :: System.FormatException: String was not recognized as a valid DateTime. at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style) at 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。
最佳答案
如果数据库中的日期是以日期格式存储的,那么你可以这样做:
DateTime d1 = b.dr.GetDateTime(1).Date;
DateTime d2 = System.DateTime.Today;
TimeSpan ts = d2.Subtract(d1);
编辑:
如果该字段以日期格式存储在数据库中,例如 date、datetime、datetime2、smalldatetime 等,SqlDataReader.GetDateTime() 方法将获取该值并将其转换为 .Net DateTime 值。当日期值表示为这些专门的日期数据类型时,它们通常更便于操作。
日期字符串的问题是有时它们可以有多种解释。但是,专门的日期格式中的每一种都有特定且定义明确的解释。但是,如果您尝试将日期/时间值与字符串表示形式相互转换,您可能会再次遇到格式问题。只要您能避免此类转换,无论服务器中的日期时间设置如何,一切都会很好。
如果数据库中的字段没有时间成分(如果数据库数据类型是DATE而不是DATETIME),可以省略第一行的.Date部分,如下:
DateTime d1 = b.dr.GetDateTime(1);
DateTime d2 = System.DateTime.Today;
TimeSpan ts = d2.Subtract(d1);
关于c# - 托管后日期时间出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132884/