字符串未被识别为数据集中的有效DateTime

use*_*774 6 .net sql asp.net

我有一个来自SQL服务器的数据集,它绑定了aspx页面上的gridview.我使用以下代码在网页上发布日期:

<asp:Label ID="Label10" runat="server" Text='<%# Convert.ToDateTime(Eval("date1")).ToString("yyyy/MM/dd")  %>' 
Run Code Online (Sandbox Code Playgroud)

SQL服务器上的日期时间是2015-12-06 00:00:00.000,在网页上显示为2015/06/12.正确的日期应为2015/12/06(2015年12月6日).我在webconfig上有全球化.

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US"/>
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何解决这个问题?

Igo*_*gor 19

SQL Server应具有的日期在以下类型中的一种坚持,从不为别的(被其它的东西我指的是varchar,text,int,BigInt,或别的什么"创意")

  • DateTime2
  • DateTime
  • Date
  • DateTimeOffset

有关更多类型,请参阅日期和时间数据类型和函数(Transact-SQL)

因此,SQL Server中的显示应该永远不会重要,因为没有与该类型关联的实际显示或格式.你在SSMS的查询窗口中看到的确实有格式化,但只是因为它必须以某种方式显示,这种格式化通常用ISO8601表示法完成,与实例的实际持久性无关.

在从SQL Server .NET代码返回的实例应该是类型System.DateTime或者System.DateTimeOffset如果你同时使用,后者DateTimeOffset在SQL服务器,该服务器持续从实例UTC的偏移量.然后ToString(),您可以使用各种格式选项来根据需要显示DateTime.DateTime的显示/格式化应该始终是表示层函数,并且永远不会比程序堆栈中的更深.

有关.net DateTime实例可用的各种格式字符串选项,请参阅自定义日期和时间格式字符串


回到OP中的相关代码

<asp:Label Text='<%# Convert.ToDateTime(Eval("date1")).ToString("yyyy/MM/dd") %>' 
Run Code Online (Sandbox Code Playgroud)

Convert.ToDateTime应该删除,因为变量date1 应该已经是一个DateTime实例(如果你遵循上面概述的最佳实践).然后ToString,您可以使用所需的格式字符串直接调用该实例.