如何将Datetime类型格式化为"yyyy-MM-dd"?

3

我从数据库中查询了一些字段,其中Planstartdate是datetime类型,而且Planstartdate可能为空。 我想将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();

有人可以帮忙实现吗?谢谢。


1
FYI,“string.IsNullOrEmpty(s) ? "" : s”表达式在某种程度上是多余和冗长的。你可以通过编写“s ?? ""”或“s ?? string.Empty”来大大简化你的代码,两者等效。 - Mike Strobel
通过使用微型ORM(例如Dapper),您可以节省大量代码。手动将数据库记录转换为对象非常无聊,浪费时间。您还可以放弃那个糟糕的DataTable。 - mason
2个回答

2
假设您在变量中存储了可空的DateTime,您需要检查它是否为null。然后,您可以访问基础值并将其转换为字符串。可空类型提供一个布尔属性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);
        }       
    }
}

点击这里使用Fiddle。

如果你想在对象初始化器中完成此操作,可以使用三元运算符编写如下代码:

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

点此进入Fiddle。

然而,我要提醒你,在这个阶段将其转换为字符串可能不是一个好主意。在代码中,你通常应该将日期保留为日期,直到它们实际需要显示给用户,因此你应该尽可能地延迟它。只有在应用程序的视图层中,你才应该将日期转换为字符串。这可以使API更加简洁(无需将其再次转换为日期来操作它),并确保可以根据用户的文化设置轻松转换为正确的格式以供用户查看。

此外,你正在进行数据库记录与.NET对象的枯燥连接。这很乏味且浪费时间。你应该使用微型ORM,例如Dapper,从而使其更加简洁。它可以是:

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

谢谢你,梅森。你真的帮助我理解并解决了这些问题。 - moonwing1988

1
虽然@mason的答案肯定有效,但我想补充一点,由于您正在使用DataTable,可能存在从数据库中获取日期(并将其转换为datatable以在Excel中打印或反之亦然)的情况,在这种情况下,“HasValue”可能不起作用,如果数据库包含DBNull.Value,则还应检查您正在提取的数据是否具有DBNull.Value
new InitOverview
{
    Planstartdate = dr["PlantStartDate"]!=DBNull.Value ? "Check Null condition mentioned in previous answer" : "no date";
}

谢谢Karan,我使用了DateTime?类型来忽略DBNull.Value。 - moonwing1988

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接