【问题标题】:Cannot format Date type data from Database无法格式化数据库中的日期类型数据
【发布时间】:2013-06-19 21:33:11
【问题描述】:

当我从数据库中获取信息时,我无法格式化 Date 类型的信息。

我正在使用:

while (sqlReader.Read())
{
    var payment = new Payment
    {
        Id = Convert.ToInt32(sqlReader["Id"]),
        Amount = Convert.ToDecimal(sqlReader["Amount"]),
        StartDay = Convert.ToDateTime(sqlReader["StartDay"]), //I want this to get this format dd.MM.yyyy
        EndDay = Convert.ToDateTime(sqlReader["EndDay"]) //I want this to get this format dd.MM.yyyy
    };

    Payments.Add(payment);
}

我尝试了我的扩展方法:.ToShortDate(),尝试了DateTime.ParseExact,我不断得到这个:String was not recognized as a valid DateTime.

【问题讨论】:

  • 你能显示StartDayEndDay的数据库值吗?
  • 您的 Convert.ToDateTime(sqlReader["StartDay"]) 是否有效,但只是没有返回所需的格式或根本不工作?
  • @GianAcuna 他们的数据库类型是“日期”,他们的值保存为“yyyy.dd.mm”
  • @kostasch。是的,它正在工作,但它没有返回所需的格式。我只希望日期在数据网格中显示为“dd.MM.yyyy”,但显示为“mm.dd.yyyy + time”
  • @Etrit 如果是这样,您必须找到显示该日期时间的列并相应地更改其DefaultCellStyle.Format,例如DefaultCellStyle.Format = "dd.MM.yyyy",这应该可以工作:)

标签: c# winforms sql-server-2008-r2


【解决方案1】:

尝试使用上面的示例,为了工作必须将 StartDay、EndDay 的数据类型从 DateTime 更改为 string

 StartDay = sqlReader["StartDay"] != null ? Convert.ToDateTime(sqlReader["StartDay"]).ToString("dd.MM.yyyy") : new Date(DateTime.Now.Year,01,01);

【讨论】:

  • StartDayDateTime 的类型,那么如何给它分配一个字符串呢?
  • 您的更新需要 OP 将他的 DateTime 的 DataGridViewColumn 更改为字符串的 DataGridViewColumn,但这不是完美的解决方案:>
  • @KingKing 我同意你的看法。最好的解决方案是您作为评论提供的解决方案。从网格样式更改它。
【解决方案2】:

Oracle.DataAccess 示例:

DateTime value=default(DateTime);
if (!reader.IsDBNull(1))
     value= reader.GetDateTime(1);  

1- 列数

【讨论】:

  • 这是什么? OP想要显示格式为dd.MM.yyyy的DateTime值,他的问题是格式化DateTime值但他认为这不涉及用于显示DateTime值的控件,DateTime值是一个持久结构,我们可以更改通过使用某种格式的控件表示 DateTime 值的文本。
  • 您可以使用 '.ToString("dd.MM.yyyy")' 轻松将 DateTime 转换为格式化字符串
  • 那么该字符串是如何使用的?它应该被某些控件用来向用户显示/显示。实际上,某些控件具有某种集成的ToString(...) 以根据某些属性相应地格式化值,例如,DataGridViewColumn 具有DefaultCellStyle.Format,这正是 OP 想要的。
  • @King King。我读了cmets来提问。我认为你的评论是对的。但是当我发布该答案时,我没有看到该评论
【解决方案3】:

【讨论】:

    【解决方案4】:

    使用DateTime.Parse() 传递文化格式:

    StartDay = DateTime.Parse("2013/06/19", new CultureInfo("en-GB", false));
    

    给出一个日期:

    19/06/2013 00:00:00

    如果需要,您可以通过调用 .ToShortDateString() 来删除小时/分钟/秒。

    实际上,您应该能够正常从数据库中获取日期,然后通过在其上调用.ToString("dd/MM/yyyy"); 来控制其在前端的输出方式。

    Response.Write(StartDate.ToString("dd/MM/yyyy"));
    

    【讨论】:

    • 这会更改CultureInfo,这将影响ToString() 的工作方式,但这不是将值格式化为您想要的任何格式的一般方法。但是在这种情况下,OP 想要 dd.MM.yyyy 所以这可行。
    • 实际上,从数据库返回的日期格式无关紧要。他可以使用日期对象上的简单.ToString("dd/MM/yyyy") 来控制它在前端的显示方式。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2019-06-03
    • 2010-11-13
    • 2013-06-25
    • 2018-06-15
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多