将DataGridView中的时间格式化为本地时区

时间:2011-08-26 16:52:31

标签: c# winforms datagridview

我有一个在设置为东部时间的SQL服务器上运行的进程,当它完成的进程时,我们使用完成时间填充表。我有一个目前正被多个应用程序使用的视图,它在不同的列中显示进程的日期/时间,因为其他应用程序正在使用它,我无法更改视图。

我用来返回我的流程数据的查询在下面,并且日期/时间正在转换为服务器端的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并搜索了SO并找到了this on converting to local time但是正在解析一个字符串。我似乎无法弄清楚如何将其应用于整个数据列。

我很感激任何帮助和/或方向从哪开始。

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分: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;
            }
        }
    }

编辑:我刚刚注意到你从EST搬到了Local,发现你无法更改数据库。我将保留顶级函数,因为这是一个受欢迎的搜索结果。

所以将这些行添加到上面函数的顶部

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);
}