我正在尝试使用GridView
来显示DateTime
值。 到目前为止,我已经能够使用以下我想要的格式字符串显示数据:
<asp:GridView ID="myGrid" ... >
<Columns>
<asp:BoundField DataField="myField" DataFormatString={0:MM/dd/yyyy hhmmss} ... />
...
</Columns>
...
</asp:GridView>
我现在遇到的问题是,这总是显示为当地时间。 我的用户希望它始终显示为 UTC,无论他们身在何处。 有没有办法强制GridView
显示 UTC 时间,而不是本地时间?
例如,我发现在 vb.net 中,要将字符串转换为日期,我可以告诉它使用通用时间:
Dim myDateAsString as String = "03/31/2014 19:00"
Dim myDate as DateTime = DateTime.ParseExact(myDateAsString, "MM/dd/yyyy HH:mm", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.AssumeUniversal)
我正在寻找类似于在asp中设置GridView
时可以使用的.AssumeUniversal
部分。
我希望我要问的是清楚的。 如果没有,我可以尝试详细说明,如果有人让我知道什么不清楚。
更新:
我的GridView
DataSource
是一个DataSet
,由一个SELECT
查询填充,该查询只是从我的数据库中提取数据。 由于我在这里感兴趣的字段是我数据库中的DateTime
字段,因此我假设当它被分配为DataSource
时,它仍然是一个DateTime
。 这是对的吗?
在我看来,与填充GridView
有关的唯一代码是
myGrid.DatqaSource = mySQLObject.sel_from_table(vars)
myGrid.DataBind()
mySQLObject.sel_from_table(vars)
将返回如上所述的DataSet
。 到目前为止的答案表明,我需要将数据更改为 UTC,然后再将其发送到GridView
- 应该在哪里/如何完成? 我是否必须以某种方式在查询中更改它? 还是在我将其指定为DataSource
之前DataSet
?
网格视图只是一种显示机制。它将以指定的格式显示您传递的任何值。如果要更改值本身(UTC 日期),则 2 个选项是:
- 模板项,您可以在其中调用 Eval 选项来计算 UTC 日期。
- 更改 myField 服务器端的值,以便网格视图可以绑定该值,例如在您的 SQL 查询结果中。
无论哪种方式,您的服务器端代码都需要将日期转换为UTC(ToUniversalTime()或DateTime.UtcNow等)并将其发送以进行显示。
以下是使用模板字段的方法。
在您的 ASPX 中
<asp:TemplateField HeaderText="My Fields">
<ItemTemplate>
<asp:Label runat="server" text='<%# GetUtcFormattedDate((DateTime)Eval("myField")) %>' />
</ItemTemplate>
</asp:TemplateField>
在代码隐藏中,可以有一个静态方法
public static string GetUtcFormattedDate(DateTime date)
{
return date.ToUniversalTime().ToString(YOUR_DATE_FORMAT_STRING);
}
您可以在查询中将时间转换为 UTC,以便从数据库中提取数据。
在您的选择子句中,只需使用以下内容。
SELECT DATEADD (HH, 'Your UTC Offset', DateYouWantSelected)