C#对象列表中DateTime属性格式化问题及尝试方案
解决列表中DateTime属性格式化的问题
看起来你在处理对象列表的日期格式化时踩了几个常见的坑,我来帮你拆解问题并给出可行的解决方案:
先说说你当前两种写法的问题
第一种写法的问题
var data = vulnerabilityList.Skip(skip).Take(pageSize).ToList() .Select(v => { v.PublishedDate = v.PublishedDate.ToString("dd/MM/yyyy"); return v; });
这里大概率会报编译错误,因为PublishedDate是DateTime类型的属性,你试图给它赋值一个string类型的结果,类型不匹配。实体类的DateTime属性是用来存储日期时间值的,直接改类型赋值是不可行的。
第二种写法的问题
var data = vulnerabilityList.Skip(skip).Take(pageSize).ToList() .Select(v => { v.PublishedDate = DateTime.ParseExact(v.PublishedDate.ToString(), "dd/MM/yyyy", CultureInfo.CurrentCulture); return v; });
这种写法属于无意义的循环转换:先把DateTime转成默认格式的字符串,再用dd/MM/yyyy去解析回DateTime。不仅达不到格式化展示的目的,还很容易因为默认ToString()的输出格式和你指定的dd/MM/yyyy不匹配,抛出FormatException异常。
正确的解决方案
根据你的需求,分两种场景处理:
场景1:只是需要展示格式化后的日期字符串(推荐)
不要修改原实体的DateTime属性,而是通过创建匿名类型或者**DTO(数据传输对象)**来携带格式化后的字符串:
方法1:使用匿名类型
var data = vulnerabilityList.Skip(skip).Take(pageSize) .Select(v => new { // 保留你需要的其他属性 Id = v.Id, VulnerabilityTitle = v.Title, // 新增格式化后的日期字段 PublishedDateFormatted = v.PublishedDate.ToString("dd/MM/yyyy") }) .ToList();
方法2:定义DTO类(适合需要复用的场景)
先创建一个用于传输的DTO类:
public class VulnerabilityDto { public int Id { get; set; } public string Title { get; set; } // 用string类型存储格式化后的日期 public string PublishedDate { get; set; } // 其他需要的属性... }
然后转换数据:
var data = vulnerabilityList.Skip(skip).Take(pageSize) .Select(v => new VulnerabilityDto { Id = v.Id, Title = v.Title, PublishedDate = v.PublishedDate.ToString("dd/MM/yyyy") }) .ToList();
场景2:必须修改原实体的日期属性(不推荐)
如果你确实需要把原实体的日期属性改成字符串格式,首先要确保实体类中的PublishedDate是string类型(如果原本是DateTime,需要修改实体定义),然后转换:
// 假设实体类已修改,PublishedDate为string类型 var data = vulnerabilityList.Skip(skip).Take(pageSize) .Select(v => { // 假设原日期存储在另一个DateTime属性(比如OriginalPublishedDate)中 v.PublishedDate = v.OriginalPublishedDate.ToString("dd/MM/yyyy"); return v; }) .ToList();
⚠️ 注意:不建议直接把实体的DateTime属性改成字符串存储,DateTime类型更适合在程序中进行日期计算、排序等操作,字符串仅适合展示场景。
内容的提问来源于stack exchange,提问作者Mihto
相关产品推荐
相关产品推荐

