2011-08-26 25 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); 
} 
相关问题