如何仅显示DateTime值的Date部分?

时间:2016-02-22 16:56:24

标签: c# sql-server datetime datagridview datagridviewcolumn

我上过这堂课:

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)"希望因此截断时间部分,但它并没有。工作;我指定从上面显示其片段的方法返回的内容:

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

...但是网格显示的是具有时间值的DateTime值,这对我来说是无用的;我只想要日期而不是日期。

我怎样才能说服显示器停止泄露TMI?

更新

我尝试实现用户1666620的答案(在添加System.ComponentModel.DataAnnotations之后)作为参考并解析&#34; DisplayFormat&#34;):

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中显示日期和时间的值。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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指令using System.Text.RegularExpressions;

答案 3 :(得分:1)

我需要将电话转移到&#34; .Date&#34;超过最后一个paren,所以不是这样:

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;