【问题标题】:Date is not taking proper format as Expected (dd/MM/yyyy)日期未按预期采用正确格式 (dd/MM/yyyy)
【发布时间】:2017-01-24 09:49:46
【问题描述】:

我想以dd/MM/yyyy 格式将日期插入数据库。为此,我写了如下:

drExpInfo[0]["CHEQUE_DT"] = string.IsNullOrWhiteSpace(e.Record["CHEQUE_DT"].ToString())
    ? DBNull.Value : (object)Convert.ToDateTime(e.Record["CHEQUE_DT"]);

它在我的本地机器上运行良好,但在我的服务器上它采用dd/MM/yyyy hh:mm:ss 格式。那么如何在那里设置相同的格式。请建议。

【问题讨论】:

  • 您使用的是什么 DBMS? db中的CHEQUE_DT是什么类型?
  • @M.Wiśnicki:我正在使用Oracle,抱歉忘记标记了。 cheque_dt 是日期数据类型
  • 不要将日期存储为具有格式的字符串。将它们存储在数据库中的适当数据类型中(例如datetime)。此类类型没有 格式。
  • @Damien_The_Unbeliever;谢谢你的建议。我在数据库中使用date。我只想在我的代码中进行自定义。这里怎么处理
  • 因此,在输入日期后立即将其解析为 .NET DateTime。然后,在将其发送数据库时使用参数(并依靠 ADO.Net 和 ODP 执行到 Oracle 的 date 的适当转换)并将其从数据库中检索回 DateTime并且,只有在将其实际显示给用户时,您才应将其转换回字符串。此时,您可以选择您喜欢的任何格式 - 但当您不需要需要一个导致格式错误的字符串时,它会将其(不恰当地)转换为字符串。

标签: c# asp.net date datetime


【解决方案1】:

使用DateTime.ToShortDateString:

drExpInfo[0]["CHEQUE_DT"] = string.IsNullOrWhiteSpace(e.Record["CHEQUE_DT"].ToString())
    ? DBNull.Value : (object)Convert.ToDateTime(e.Record["CHEQUE_DT"]).ToShortDateString();

但是,我建议您在插入时保留日期的时间部分(不使用 ToShortDateString,因为它会插入设置为午夜的时间,参见下面 Oracle 文档中突出显示的文本)并获取您想要的格式(没有时间) 当您使用日期时。

来自Oracle documentation

在日期表达式中使用默认日期格式的字符值时,Oracle 数据库会自动将它们转换为日期值。

如果您指定的日期值不带时间组件,则默认时间为午夜。 如果您指定的日期值不带日期,则默认日期为当月的第一天.

Oracle 数据库 DATE 列始终包含日期和时间字段。如果您的查询使用没有时间部分的日期格式,那么您必须确保 DATE 列中的时间字段设置为午夜。您可以使用 TRUNC(日期)SQL 函数来确保将时间字段设置为午夜,或者您可以使查询成为大于或小于(= 或 >)而不是相等的测试或不等式(= 或 !=)。否则,Oracle 数据库可能无法返回您期望的查询结果。

因此您可以在 c# 中将日期转换为您想要的任何格式,删除时间部分,Oracle 会自动将日期的时间部分设置为午夜 (00:00:00)。

【讨论】:

  • 因为你的 oracle 类型是日期,所以它应该插入时间部分为 00:00:00。我对么?我建议你保留时间部分。
  • 不,它也在 db 中显示,这就是我不想要它的原因
  • 我用 Oracle 参考资料和建议更新了我的答案。
【解决方案2】:

你可以设置 CultureInfo;

var cultureInfo = new CultureInfo("en-GB", false).DateTimeFormat;
string result = Convert.ToDateTime(e.Record["CHEQUE_DT"], cultureInfo).ToString();

【讨论】:

  • 对不起,我没有尝试代码。但是您可以添加 ToString() 或结果为 var
  • 我还需要检查 NULL。如果没有提供日期,那么您的代码将引发错误
【解决方案3】:

Check this Discussion 在这里您可以找到两种或多种在向数据库中插入记录时设置日期格式的方法。

insert into sampleDate(Start_Date) values (to_date('25-Jun-2017','YYYYMMDD'))

【讨论】:

  • 插入 sampleDate(Start_Date) 值(to_date('25-Jun-2017','YYYYMMDD'))
  • 这是一个仅链接的答案;它应该是对问题的评论或在答案中包含相关部分。但是,链接的问题与 SQL Developer 相关,而不是与 C# 中的格式化日期相关,并且似乎只是切线相关。
  • @Kathir07 您可以编辑和改进您的答案,而不是评论它。
【解决方案4】:

试试:

public static DateTime? DateFromString(string value)
{
   if (string.IsNullOrWhiteSpace(value))
     {
       return null;
     }
   else
     {
        return DateTime.ParseExact(dateString, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
     }
}

DateTime? date=DateFromString(e.Record["CHEQUE_DT"]);
drExpInfo[0]["CHEQUE_DT"] = date==null? DBNull.Value : (object)date);

【讨论】:

  • 最好的重载方法在DateTime? date= DateFromString(e.Record["CHEQUE_DT"];行有一些无效参数
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2011-06-20
  • 2015-03-22
相关资源
最近更新 更多