You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:05:22