【问题标题】:How can I display the Date portion only of DateTime values?如何仅显示 DateTime 值的 Date 部分?
【发布时间】:2016-06-04 05:13:56
【问题描述】:

我有这门课:

public class ScheduledReports
{
    public string Unit { get; set; }
    public string ReportName { get; set; }
    public DateTime NextExecutionCalcd { get; set; }
    public string AllEmailAddresses { get; set; }
    public DateTime DataRangeBeginDateCalcd { get; set; }
    public DateTime DataRangeEndDateCalcd { get; set; }
}

底层附属 SQL Server 表使用 DateTime 字段。

我像这样填充类的实例:

while (sqlReader.Read())
{
    ScheduledReports sr = new ScheduledReports();
    . . . // Other class member assignments elided for brevity
    sr.DataRangeBeginDateCalcd = GetNextDataRangeBeginDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsBeginDateArg"]).Date); 
    sr.DataRangeEndDateCalcd = GetNextDataRangeEndDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsEndDateArg"]).Date); 
    scheduledRpts.Add(sr);
}

如您所见,我正在使用“Convert.ToDateTime(bla).Date”而不是简单的“Convert.ToDateTime(bla)”,希望借此截断时间部分,但它不起作用;我分配了从上面显示了 sn-p 的方法返回的内容:

private void LoadScheduledTab()
{
    List<ScheduledReports> scheduledRpts = RoboReporterSQL.GetScheduledReports();
    dataGridViewScheduled.DataSource = scheduledRpts;
}

...但是网格显示日期时间值和时间值,这对我来说没用;我只想要日期,只想要日期。

如何说服显示器停止泄露 TMI?

更新

我尝试像这样实现用户 1666620 的答案(在添加 System.ComponentModel.DataAnnotations 之后)作为参考并解析“DisplayFormat”):

public class ScheduledReports
{
    public string Unit { get; set; }
    public string ReportName { get; set; }
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MMM/yyyy}")]
    public DateTime NextExecutionCalcd { get; set; }
    public string AllEmailAddresses { get; set; }
    public DateTime DataRangeBeginDateCalcd { get; set; }
    public DateTime DataRangeEndDateCalcd { get; set; }
}

...但它仍然失败;它会编译,但仍会在 DataGridView 中显示日期和时间的值。

【问题讨论】:

    标签: c# sql-server datetime datagridview datagridviewcolumn


    【解决方案1】:

    Date 属性仍然是 DateTime 类型,它始终具有时间属性,因此我猜你的 UI 会选择它。

    要仅显示日期,请使用.ToString("d")

    【讨论】:

    • 被分配的成员是一个日期时间;从 DateTime 更改类中的数据类型(对应于它们的真实身份,以及它们在 SQL Server 表中的内容)对于应该是一个非常快速的修复来说似乎相当激烈。
    • 通常你将数据库和 UI 分开。不知道您在报告中使用的是什么,但通常应该有一种简单的方法来抽象它并定义输出。也许它只是某个地方的配置,您可以说应该使用哪种日期格式?你的问题是关于 DateTime 类型的,这就是答案;)
    • 这就是您要寻找的答案吗? stackoverflow.com/questions/4033113/…
    【解决方案2】:

    在您的班级中,使用 DisplayFormat 数据注释。

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString="{0:dd/MMM/yyyy}")]
    public DateTime NextExecutionCalcd { get; set; }
    

    https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.dataformatstring(v=vs.110).aspx

    【讨论】:

    • 我得到,“找不到类型或命名空间名称 'DisplayFormat'(您是否缺少 using 指令或程序集引用?)”以及 DisplayFormatAttribute 的相同错误消息。
    • @B.ClayShannon 您需要根据我的答案中的链接添加对System.ComponentModel.DataAnnotations 的引用。
    • 不,这也行不通;我得到,“......命名空间'System.ComponentModel'中不存在DataAnnotations。”输入“System.ComponentModel.”后,Intellisense 唯一提供给我的是“设计”
    • @B.ClayShannon 您需要将 dll 添加到项目中作为参考。
    【解决方案3】:

    我遇到了同样的问题。我不知道这是否是最好的解决方案,但我用这样的正则表达式切断了时间属性:

    Regex.Match(Convert.ToDateTime("01.01.2014 00:00:00").Date.ToString(), @"\d{2}\.\d{2}\.\d{4}").ToString();
    

    这行代码仅将日期(在本例中为 01.01.2014)作为字符串返回。

    Regex.Match() 将字符串与模式进行比较并返回匹配项:在这种情况下,它搜索两位数(\d{2})、一个点(.)、另外两位数(\d{2}另一个点 (.) 和 4 位数字 (\d{4})。

    要使用正则表达式,您需要使用指令using System.Text.RegularExpressions;

    【讨论】:

    • 谢谢,但这也将值作为字符串返回;我可能不得不这样做,但我真的试图将值保留为日期而不是字符串。
    【解决方案4】:

    我需要将“.Date”的调用移到最后一个括号之后,所以不要这样:

    sr.DataRangeBeginDateCalcd = GetNextDataRangeBeginDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsBeginDateArg"]).Date);
    sr.DataRangeEndDateCalcd = GetNextDataRangeEndDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsEndDateArg"]).Date);
    

    ...是这样的:

    sr.DataRangeBeginDateCalcd = GetNextDataRangeBeginDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsBeginDateArg"])).Date;
    sr.DataRangeEndDateCalcd = GetNextDataRangeEndDateAfterQueued(unit, rptName, Convert.ToDateTime(sqlReader["NextExecutionsEndDateArg"])).Date;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2010-10-08
      • 1970-01-01
      • 2014-03-21
      • 2015-05-30
      • 1970-01-01
      • 2016-09-09
      相关资源
      最近更新 更多