2014-03-31 142 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