2014-03-31 106 views
0

我试图使用GridView来显示DateTime值。到目前为止,我已经能够通过显示利用我想要的格式字符串中的数据:以ASP格式显示日期:GridView BoundField

<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部分。

我希望我所问的很清楚。如果没有,我可以尝试详细说明,如果有人让我知道什么是不明确的。


UPDATE:

DataSourceGridView是由SELECT查询,只是从我的数据库中提取数据填补了DataSet。由于我在这里感兴趣的字段是我的数据库中的一个DateTime字段,因此我认为它将被指定为DataSource时仍然是DateTime。那是对的吗?

在我看来像一些相关的填充GridView唯一的代码是

myGrid.DatqaSource = mySQLObject.sel_from_table(vars) 
myGrid.DataBind() 

mySQLObject.sel_from_table(vars)将返回一个DataSet如上所述。到目前为止的答案表明,我需要将数据更改为UTC,然后将它发送到GridView - 在哪里/如何完成?我是否必须以某种方式在我的查询中更改它?或者在DataSet之前,我将其指定为DataSource

回答

1

网格视图仅仅是一种显示机制。它会以您指定的格式显示您传递的任何值。如果你想改变它自己的值(Utc Date),那么有两个选项:

  1. 模板项目你可以调用Eval选项来计算Utc日期。
  2. 更改myField服务器端的值,以便网格视图可以绑定该值。例如在你的SQL查询结果中。

无论哪种方式,您的服务器端代码需要将日期转换为UTC(ToUniversalTime()或DateTime.UtcNow等)并将其发送到显示器。

这里是你如何使用TemplateField来做的。

在你的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); 
} 
+0

嗯,好的。如果我的'DataSource'只是'SELECT'查询的结果,我怎么在转换到'GridView'之前进行转换呢?查看我的OP的更新。 – GeneralMike

+0

谢谢!我实际上使用VB,所以我不得不玩弄你有一点,但具有'Eval'思想的'TemplateField'工作得很好。 – GeneralMike

+1

很高兴。将来如果你想从C#中获得VB,那么就有在线转换网站。粘贴c#,得到vb。 –

0

你可以在时间转换为UTC在查询从数据库中提取数据。

在你的select子句中使用下面的内容。

SELECT DATEADD (HH, 'Your UTC Offset', DateYouWantSelected) 
+1

由于夏令时,UTC偏移量可能不是恒定的,所以我不认为这样做会对我有用。 – GeneralMike

+0

您可以从您正在运行的应用程序中传递UTC偏移量。 http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx – Bailcm

+0

从您提供的链接中:'注意:GetUtcOffset方法只识别当地夏令时调整规则为当地时区。因此,只有在最新调整规则生效期间才能准确返回本地时间的UTC偏移量。如果时间是受历史调整规则影响的历史日期和时间值,它可能会返回不准确的结果。“仅当偏移总是相同时才使用DATEADD。对我来说情况并非如此。 – GeneralMike