如何在DataGridView列中将UNIX时间戳转换为DateTime格式显示
解决SQLite UNIX时间戳在DataGridView中显示为DateTime的问题
方法一:SQL查询阶段直接转换
SQLite内置datetime()函数,可直接将UNIX时间戳转换为标准时间格式字符串,无需在C#中额外处理。修改你的查询语句:
// 替换"TimeStampColumn"为数据库中存储时间戳的实际列名 string sql = "Select *, datetime(TimeStampColumn, 'unixepoch') AS DisplayTime FROM Main";
查询结果会新增DisplayTime列,直接绑定到DataGridView即可显示可读的DateTime格式,可通过设置dataGridView1.Columns["TimeStampColumn"].Visible = false隐藏原时间戳列。
方法二:填充DataTable后手动转换
若不想修改SQL,可在DataTable填充完成后新增DateTime类型列,逐行转换时间戳:
string sql = "Select * from Main"; var conn = new SQLiteConnection("Data Source = FistDB.db;Version = 3"); conn.Open(); DataSet ds = new DataSet(); var da = new SQLiteDataAdapter(sql, conn); da.Fill(ds); DataTable dt = ds.Tables[0]; // 新增DateTime类型列 dt.Columns.Add("DisplayTime", typeof(DateTime)); foreach (DataRow row in dt.Rows) { long timestamp = Convert.ToInt64(row["TimeStampColumn"]); // 秒级时间戳用FromUnixTimeSeconds,毫秒级用FromUnixTimeMilliseconds row["DisplayTime"] = DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime; } // 隐藏原时间戳列 dataGridView1.Columns["TimeStampColumn"].Visible = false; dataGridView1.DataSource = dt;
方法三:通过DataGridView的CellFormatting事件动态转换
这种方式无需修改DataTable,在单元格渲染时实时转换时间戳:
- 先完成数据源绑定:
string sql = "Select * from Main"; var conn = new SQLiteConnection("Data Source = FistDB.db;Version = 3"); conn.Open(); DataSet ds = new DataSet(); var da = new SQLiteDataAdapter(sql, conn); da.Fill(ds); dataGridView1.DataSource = ds.Tables[0];
- 添加CellFormatting事件处理逻辑:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { // 匹配时间戳列名,替换为实际列名 if (dataGridView1.Columns[e.ColumnIndex].Name == "TimeStampColumn" && e.Value != null) { if (long.TryParse(e.Value.ToString(), out long timestamp)) { // 根据时间戳精度选择转换方法 e.Value = DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime; e.FormattingApplied = true; } } }
注意事项
- 若时间戳是毫秒级(13位数字),替换
FromUnixTimeSeconds为FromUnixTimeMilliseconds; - 确保时间戳列的数值有效,避免转换时抛出异常。
内容的提问来源于stack exchange,提问作者Andrew Kazun
相关产品推荐
相关产品推荐

