2011-08-26 29 views
3

我有一個在設置爲東部時間的SQL服務器上運行的進程,當它完成的進程我們用完成時間填充表時。我有一個視圖,目前正被多個應用程序使用,這些應用程序在不同列中顯示進程的日期/時間,因爲其他應用程序正在使用該視圖,所以我無法更改視圖。將DataGridView中的時間格式化爲本地時區

我用來返回我的流程數據的查詢如下,日期/時間正在轉換爲服務器端的varchar - 所以它不會作爲日期/時間來到UI。

SELECT CONVERT(VARCHAR(10), A2.TaskDateTime, 101) AS TaskDate, 
     CONVERT(VARCHAR(5), A2.TaskDateTime, 108) AS TaskTime 
FROM Task AS T2 
JOIN Application_Task AS A2  
    ON A2.TaskID = T2.TaskID 

該數據然後通過datagridview顯示在UI中。我正嘗試將DataGridView中的時間列格式化爲我的本地時區,因爲用戶將處於不同的時區。

我查看了DataGridViewCellStyle.Format並搜索到了,發現this on converting to local time,但這是解析一個字符串。我似乎無法弄清楚如何將其應用於整個數據列。

我會很感激任何幫助和/或方向從哪裏開始。

回答

6

我CellFormatting事件處理這個問題:

private void OnCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.RowIndex < 0 || e.ColumnIndex < 0) return; 
     DataGridView dgView = (DataGridView)(sender); 
     // no need to add TaskTime... 
     if (e.ColumnIndex != dgView.Columns["TaskDate"].Index) return; 
     string cellValue = e.Value + " " + dgView.CurrentRow.Cells[dgView.Columns["TaskTime"].Value); 
     DateTime dtValue; 
     DateTime.TryParse(cellValue, out dtValue); 
     DateTime dtValueUTC = TimezoneInfo.ConvertTimeToUtc(dtValue, "Eastern Time Zone"); 
     e.Value = dtValueUTC.Value.ToLocalTime(); 
    } 
+0

我在這很拉時間的字符串版本的數據。我正在使用的視圖將時間作爲varchar返回,因此它不知道該列是DateTime字段。 – Taryn

+0

可以按原樣返回datetime字段(即datetime)。之後,在具有gridview的客戶端,可以使用Format屬性設置爲「mm/dd/yyyy」到「hh:mm:ss t」。這對於日期時間值會在兩個邊界之間發生真正的幫助 - 例如,8月26日太平洋時間下午5:00實際上是8月27日的通用。 – Arun

+0

我不能像我在原始問題中所說的那樣,我正在使用多個應用程序開始使用的視圖,所以我無法更改它。 – Taryn

0

確保所有的數據是UTC在數據庫上。這幾乎是在數據庫上存儲日期/時間的標準方式。我經過慘痛的教訓才學到這個。

轉儲這個代碼到你CellFormatting事件

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.Value is DateTime) 
     { 
      DateTime value = (DateTime)e.Value; 
      switch (value.Kind) 
      { 
       case DateTimeKind.Local: 
        break; 
       case DateTimeKind.Unspecified: 
        e.Value = DateTime.SpecifyKind(value, DateTimeKind.Utc).ToLocalTime(); 
        break; 
       case DateTimeKind.Utc: 
        e.Value = value.ToLocalTime(); 
        break; 
      } 
     } 
    } 

編輯:我剛纔注意到你從美國東部時間移動到本地,並注意到您不能更改數據庫。由於這是一個受歡迎的搜索結果,因此我將保留頂級功能。

所以添加這些行的函數的頂部上述

if (e.ColumnIndex == 0) //change this to your column 
{ 
    String sqlFormat = "MM/dd/yyyy"; //change this to the sql format 
    DateTime parsedDateTime = DateTime.ParseExact(e.Value, sqlFormat, null); 
    TimeZoneInfo tziEastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    e.Value = TimeZoneInfo.ConvertTimeToUtc(parseDateTime, tziEastern); 
} 
相關問題