我从数据库查询某些字段,Planstartdate是datetime类型,并且Planstartdate可以为null,我想将Planstartdate格式化为“ yyyy-MM-dd”

            DataTable dt = ds.Tables[0];
        var query = dt.AsEnumerable()
        .Select(dr =>
        new InitOverview
        {
            IID = string.IsNullOrEmpty(dr.Field<string>("IID").ToString()) ? "" : dr.Field<string>("IID"),
            ProjectName = string.IsNullOrEmpty(dr.Field<string>("ProjectName")) ? "" : dr.Field<string>("ProjectName"),
            TeamLead = string.IsNullOrEmpty(dr.Field<string>("TeamLead")) ? "" : dr.Field<string>("TeamLead"),
            Status = string.IsNullOrEmpty(dr.Field<string>("Status")) ? "" : dr.Field<string>("Status"),
            OverallStatus = string.IsNullOrEmpty(dr.Field<string>("OverallStatus")) ? "" : dr.Field<string>("OverallStatus"),
            Planstartdate = dr.Field<DateTime?>("Planstartdate"),
            Planenddate = dr.Field<DateTime?>("Planenddate"),
            Actualstartdate = dr.Field<DateTime?>("Actualstartdate"),
            Actualenddate = dr.Field<DateTime?>("Actualenddate")
        }
        ).ToList();


任何人都可以帮助实现它吗?
谢谢

最佳答案:

HasValue
using System;

public class Program
{
    public static void Main()
    {
        DateTime? actualStartDate = DateTime.Now;

        if(actualStartDate.HasValue)
        {
            string s = actualStartDate.Value.ToString("yyyy-MM-dd");
            Console.WriteLine("value: " + s);
        }       
    }
}


小提琴here。

如果要在对象初始化程序中执行此操作,则使用ternary operator看起来像这样:

new InitOverview
{
    Planstartdate = dr.Field<DateTime?>("Planstartdate").HasValue
        ? dr.Field<DateTime?>("Planstartdate").Value.ToString("yyyy-MM-dd") : "no date";
}


小提琴here。

但是,我要提醒您,此时将其转换为字符串可能不是一个好主意。在代码中,通常应将日期保留为日期,直到实际需要向用户显示日期为止,因此应将其尽可能地延迟。实际上,只有在应用程序的视图层中,您才应该将日期转换为字符串。这样可以使API保持整洁(无需再次将其转换为日期来进行操作),并确保可以轻松地将其转换为正确的格式,以便根据其区域性设置向用户显示。

另外,您正在无聊地将数据库记录连接到.NET对象。这很乏味并且浪费时间。您应该使用诸如Dapper之类的微型ORM,并使其更加整洁。它可能是:

using (var connection = new SqlConnection(connectionString))
{
    return connection.Query<InitOverview>(selectStatement).AsList();
}