绑定MS Access的DataGridView及iTextSharp导出PDF时间格式错误问题
问题根因
- Access的
Date/Time类型本质是同时存储日期+时间的复合值,底层用双精度浮点数实现:整数部分代表1899年12月30日之后的天数,小数部分代表当天时间的占比。你单独存储日期时没有传入时间部分,默认补0对应12:00:00 AM;单独存储时间时没有传入日期部分,默认补0对应1899/12/30,这就是时间值显示带1899年日期的原因。 - DataGridView绑定
Date/Time类型字段时,默认会输出完整的日期+时间内容,不会自动识别你要单独展示日期还是时间。 - 导出PDF时你直接读取了原始
DateTime值或者DataGridView的默认显示内容,没有做自定义格式化,因此保留了多余的部分。
修复步骤
1. 修正DataGridView显示格式
数据绑定完成后,手动指定两个列的显示格式即可:
// 日期列仅显示日期 dataGridView1.Columns["Date"].DefaultCellStyle.Format = "dd/MM/yyyy"; // 时间列仅显示时间+上午/下午标识 dataGridView1.Columns["Time"].DefaultCellStyle.Format = "hh:mm:ss tt";
如果是通过设计器绑定的数据源,也可以直接在列属性的DefaultCellStyle→Format项中填入对应格式字符串。
2. 修正iTextSharp导出PDF的格式
导出时不要直接读取原始DateTime值,手动做格式化后再写入PDF单元格:
// 处理日期列 string pdfDate = Convert.ToDateTime(dataRow["Date"]).ToString("dd/MM/yyyy"); // 处理时间列 string pdfTime = Convert.ToDateTime(dataRow["Time"]).ToString("hh:mm:ss tt");
(可选)优化插入逻辑
你当前插入时把DateTime转成字符串再入库,容易出现格式歧义,建议直接传入DateTime类型值:
// 插入日期直接传日期部分,自动清空时间 var dateValue = datetimepicker.Value.Date; // 插入时间直接传时间部分 var timeValue = DateTime.Now.TimeOfDay;
内容的提问来源于stack exchange,提问作者karan ugale
相关产品推荐
相关产品推荐

