.net 存储UTC,在DataGridView中显示本地时间(DataSource=DataTable)

.net 存储UTC,在DataGridView中显示本地时间(DataSource=DataTable),.net,database,winforms,datetime,datagridview,.net,Database,Winforms,Datetime,Datagridview,在车队管理中,跟踪器跨时区移动,并使用始终为UTC的时间戳存储其位置。这很好,因为它必须遵守一个时区。否则,如果它更改时区(即夏令时),可能会有两个不同的位置具有相同的时间戳。 如果车队经理使用我的软件查看数据,他希望看到本地时区中的时间,即使他看到混淆的时间戳(他会知道原因) 为了实现这一点,我将它们作为UTC时间存储在数据库中,并在显示时将它们转换为本地时间。我使用: DateTime.SpecifyKind(date, dateTimeKind) DateTime.ToUniversalT

在车队管理中,跟踪器跨时区移动,并使用始终为UTC的时间戳存储其位置。这很好,因为它必须遵守一个时区。否则,如果它更改时区(即夏令时),可能会有两个不同的位置具有相同的时间戳。

如果车队经理使用我的软件查看数据,他希望看到本地时区中的时间,即使他看到混淆的时间戳(他会知道原因)

为了实现这一点,我将它们作为UTC时间存储在数据库中,并在显示时将它们转换为本地时间。我使用:

DateTime.SpecifyKind(date, dateTimeKind)
DateTime.ToUniversalTime()
DateTime.ToLocalTime()
因此,每个人都应该在高潮时感到高兴,但有些表被设置为DataGridView的数据源
(Windows.System.Forms.DataGridView.DataSource=System.Data.DataTable)
。这本身并不坏,但我不知道如何在两者之间进行转换

如果我能使用
DataGridViewCellStyle
.Format属性来指示要显示的时区,我会很高兴,但据我所知,这不是一个选项。现在,在一些表中,两个时间都存储在数据库中,因此用户决定显示/隐藏哪个时间,但是如果必须将数据库中的每个
DateTime
列加倍,并在其旁边放置显示/隐藏功能,这将是一个真正的麻烦


你建议走哪条路?我已经阅读了有关
RowCreatedEvent
()的内容,但我不是在构建web应用程序。

您可以使用
CellFormatting
事件:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.Value is DateTime)
    {
        var date = (DateTime)e.Value;
        var localDate = date.ToLocalTime();
        e.Value = localDate;
        e.FormattingApplied = true;
    }
}

伟大的谢谢你,这几乎奏效了。最后一行
e.FormattingApplied=true导致错误。有没有可能,在这里更改值和格式化值是不一样的?@KarstenGutjahr,也许。。。请尝试将
localDate.ToString()
指定给
e.Value
,或者删除
e.FormattingApplied=true
我担心在某些(未来)情况下,该值会作为“未指定”日期时间写回数据库,我不希望该本地日期出现在数据库中。因此,我将坚持你的第二个建议,删除
e.formatingapplicated=true