【问题标题】:Store UTC, show Local Time in DataGridView (DataSource = DataTable)存储 UTC,在 DataGridView 中显示本地时间(DataSource = DataTable)
【发布时间】:2013-10-07 14:34:52
【问题描述】:

在车队管理中,跟踪器跨时区移动并使用始终为 UTC 的时间戳存储其位置。这很好,因为它必须坚持一个时区。否则,如果它更改时区(i.e. for daylight saving time).

,它可能有两个具有相同时间戳的不同位置

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

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

DateTime.SpecifyKind(date, dateTimeKind)
DateTime.ToUniversalTime()
DateTime.ToLocalTime()

所以每个人都应该像高水位的蛤蜊一样快乐,但有些表被设置为 DataGridView (Windows.System.Forms.DataGridView.DataSource = System.Data.DataTable) 的 DataSource。这本身还不错,但我不知道如何在两者之间进行转换。

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

你建议哪种方式?我已经阅读了有关 RowCreatedEvent (here) 的信息,但我没有构建 Web 应用程序。

【问题讨论】:

    标签: .net database winforms datetime datagridview


    【解决方案1】:

    您可以使用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.FormattingApplied = true;
    猜你喜欢
    • 2020-10-10
    • 2022-06-10
    • 1970-01-01
    • 2018-05-08
    • 2019-09-16
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多