.NET EF Core中如何仅存储日期与时分?去除秒和毫秒
在.NET EF Core中处理日期时间格式:去除秒/毫秒及自定义格式
一、能否去除日期时间的秒和毫秒?
可以,根据使用场景不同,有几种实现方式:
- 模型特性控制显示:通过
DisplayFormat特性控制界面展示格式,若要确保数据库存储时无秒和毫秒,可在模型构建阶段配置字段精度,或在业务逻辑中手动截断日期。 - JSON序列化全局配置:Web API场景下,通过配置序列化器统一控制接口传入/返回的日期格式,自动去除秒和毫秒。
- 手动截断处理:在代码中对
DateTime实例进行截断,比如利用DateTime.Truncate扩展方法,或构造新实例仅保留到分钟维度。
二、如何在控制器传入/返回数据时得到HH-mm yyyy-MM-dd格式?
分场景给出解决方案:
1. MVC视图的展示与编辑场景
直接修改模型上的特性配置,指定目标格式即可:
[DataType(DataType.DateTime)] [DisplayFormat(DataFormatString = "{0:HH-mm yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ArrivalTime { get; set; }
DataType.DateTime标记字段为完整日期时间类型(区别于仅日期的DataType.Date)DataFormatString设置为目标格式,其中HH代表24小时制小时,mm代表分钟ApplyFormatInEditMode = true确保编辑界面也使用该格式渲染
2. Web API接口场景
API场景下模型特性通常不生效,需配置JSON序列化器:
方式一:使用System.Text.Json(.NET Core 3.0+默认)
在Program.cs中全局配置自定义转换器:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new CustomDateTimeConverter()); }); // 自定义日期时间转换器 public class CustomDateTimeConverter : JsonConverter<DateTime> { private const string TargetFormat = "HH-mm yyyy-MM-dd"; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 解析传入的指定格式字符串 if (DateTime.TryParseExact(reader.GetString(), TargetFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) { return date; } return DateTime.Parse(reader.GetString()); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { // 输出时按指定格式序列化 writer.WriteStringValue(value.ToString(TargetFormat, CultureInfo.InvariantCulture)); } }
方式二:使用Newtonsoft.Json(若项目引用该包)
在Program.cs中直接配置日期格式字符串:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.DateFormatString = "HH-mm yyyy-MM-dd"; });
3. 控制器方法内手动转换
如果需要在控制器中单独处理传入的日期字符串,可直接解析:
[HttpPost] public IActionResult Submit(string arrivalTimeStr) { if (DateTime.TryParseExact(arrivalTimeStr, "HH-mm yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var arrivalTime)) { // 使用转换后的DateTime对象执行业务逻辑 return Ok(arrivalTime); } return BadRequest("日期格式不符合要求"); }
补充:数据库存储时截断秒和毫秒
若要确保EF Core写入数据库的日期时间无秒和毫秒,可在OnModelCreating中配置字段精度:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // MySQL示例:截断到分钟 modelBuilder.Entity<YourEntity>() .Property(e => e.ArrivalTime) .HasColumnType("datetime(0)"); // SQL Server示例:设置精度为0 // modelBuilder.Entity<YourEntity>() // .Property(e => e.ArrivalTime) // .HasPrecision(0); }
内容的提问来源于stack exchange,提问作者user16778385
相关产品推荐
相关产品推荐

