【问题标题】:.net DateTime object, ensuring MM/DD/YYYY formatting.net DateTime 对象,确保 MM/DD/YYYY 格式
【发布时间】:2011-12-23 07:54:13
【问题描述】:

.net DateTime 对象似乎默认为计算机设置的任何格式。由于我来自英国,这意味着 DateTime 对象是 DD/MM/YYYY。

这通常很好,但我正在尝试使用 DateTime 对象将当前时间放入 Access 数据库上的记录提交中。 Access(或一般的 SQL,不太清楚)要求日期格式为 MM/DD/YYYY 格式。

有没有一种方法可以让 DateTime 对象将日期格式化为 MM/DD/YYYY 格式,还是我必须转换为字符串,切换字符串,然后插入?

【问题讨论】:

  • 您可能应该使用 yyyy-MM-dd 格式 (ISO 8601)
  • 实际上,如果您正确使用 DateTime 字段,则日期的格式无关紧要,因为没有转换为字符串。您没有使用连接的 sql 字符串,是吗?那会很糟糕。
  • 好吧,使用参数化查询,你就不会有这个问题了。

标签: .net sql ms-access datetime


【解决方案1】:

如果您要插入数据库,请不要使用日期字符串。使用参数对象并为值提供日期对象。

访问

string mystatment = "Insert into TableName (column1, datecolumn) values (?,?)"

OleDbCommand cmd = conn.CreateCommand();
cmd.Commandtext = mystatement;
cmd.Parameters.AddWithValue("@column1", mycolumn1variable);
cmd.Parameters.AddWithValue("@datecolumn", yourDateTimeVariable);

如果您使用生产代码正确执行此操作,请确保您有异常处理等。

using (OleDbConnection conn = new OleDbConnection("connection string"))
{
    using (OleDbCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "Insert into TableName (column1, datecolumn) values (?,?)";

        OleDbParameter param;
        param = new OleDbParameter("name",  OleDbType.VarChar, 36); // if you know the size of the column specify it
        param.Value = mycolumn1variable;
        cmd.Parameters.Add(param);

        param = new OleDbParameter("mydate", OleDbType.Date); // if you know the size of the column specify it
        param.Value = yourDateTimeVariable;
        cmd.Parameters.Add(param);

        conn.Open();
        cmd.ExecuteNonQuery(); //etc
    }
}

对于 sql,您使用命名的 @parameters 而不是 ?在您的语句中并改用 SqlCommand。

如果是屏幕显示,请根据用户的文化尊重用户设置和格式。

【讨论】:

  • 这背后的原因是什么?我正在做的字符串连接最终工作正常,为什么这种方法会更好?
  • 如您所见,字符串格式的日期取决于位置。想想 1 月 10 日和 10 月 1 日,当您使用美国与 GB/AU 日期格式时
  • 因为使用这种方法,您可以让 .NET 和 Access 完成繁重的工作。无论采用何种格式,Access 都可以计算出日期。让它。从理论上讲,您的数据库可能与您的程序处于不同的上下文(因此文化)中,因此您不希望将该插入与单一文化联系起来。此外,硬编码文化格式并不是一个好的做法。
  • 嗯,好的,谢谢大家。我已经修改了我的代码以反映这种方法,我会记住它以备将来使用。
  • @SamuelSmith - 另一个不使用连接字符串的原因是为了防止 SQL 注入攻击。不要误以为“我的网站不会大到足以让任何人攻击”。有一些自动化系统可以搜索互联网并攻击他们发现的任何网站(称为蠕虫),然后它们会将您的网站变成病毒、恶意软件、网络钓鱼、垃圾邮件和其他恶意软件的宿主。如果您不知道什么 SQL 注入攻击,请阅读此en.wikipedia.org/wiki/SQL_injection
【解决方案2】:

您可以调用 DateTime.ToString("MM/dd/yyyy") 这样您就不必切换它了

【讨论】:

    【解决方案3】:

    使用DateTime结构的ToString方法:

    using System;
    using System.Globalization;
    
    string s = DateTime.Now.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine(s);
    

    【讨论】:

      【解决方案4】:

      当你使用DateTime 类时,你可以这样做:

      DateTime yourDate = DateTime.Now;
      Console.WriteLine("Your Date: {0}", yourDate.ToString("MM/dd/yyyy"));
      

      【讨论】:

      • @SamuelSmith 不需要“chop-n-change”。 DateTime 类非常容易使用和成型。 :) 很高兴我能帮上忙。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2016-12-25
      • 2016-01-02
      • 1970-01-01
      • 2013-08-31
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多