【问题标题】:how to convert datetime format如何转换日期时间格式
【发布时间】:2025-12-22 17:20:08
【问题描述】:

嗨,我给用户和 ajax 日历扩展器提供了一个文本框,以选择 dd/mm/yyyy 格式的日期,之后我使用以下函数将其转换为 mm/dd/yyyy 格式以插入到 sql server 数据库中,但是它在一页中无法正常工作,我收到错误日期时间转换错误,而在其他页面中,我必须输入 yyyy/mm/dd 格式才能将数据插入数据库。我的代码在 localhost 中运行良好,但在服务器中出现了这些错误。我的功能是

 protected string getDate_MDY(string inDate)
{
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");
    DateTime dtProjectStartDate = Convert.ToDateTime(inDate);
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
    return (Convert.ToDateTime(dtProjectStartDate).ToString("MM/dd/yyyy"));
}

为了插入,我使用了 getDate_MDY(txtcreatedate.text);

我只想通过从文本框中获取 dd/mm/yyyy 格式将我的正确日期插入数据库。 .请告诉我修改它的正确方法...谢谢

【问题讨论】:

  • 所有进入数据库的日期值都应该是 yyyy-MM-dd 格式
  • 其实@Hugo 那个格式不安全;试试SET LANGUAGE FRENCH; SELECT DATENAME(MONTH, CONVERT(DATETIME,'2015-03-11')); - 你会期待mars,但你会得到novembre。法语不是唯一可能导致此问题的设置。见sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/…
  • 您为什么要尝试将区域性和格式不明确的字符串转换为不同的区域性和格式不明确的字符串?要将日期传递给 SQL Server,您需要一个强类型的 DATE 或 DATETIME 参数,并且您不想担心格式。如果您绝对需要传递字符串文字,则 only 不带时间的日期的安全格式是 YYYYMMDD。其他任何事情都可能被误解。我还建议不要向用户显示dd/mm/yyyy,因为他们可能会像软件一样误解这些内容。
  • 有趣,谢谢@AaronBertrand,约会太痛苦了。
  • 我必须显示 dd/mm/yyyy 格式,因为用户通常使用这种格式。他们想先查看日期

标签: c# asp.net sql-server asp.net-ajax


【解决方案1】:

使用DateTime.ParseDateTime.ParseExact 而不是更改当前线程文化。这两种方法都有重载,在解析字符串时需要使用文化。

例如:

protected string getDate_MDY(string inDate)
{
    DateTime date = DateTime.Parse(inDate, new CultureInfo("en-GB"));
    return date.ToString("MM/dd/yyyy", new CultureInfo("en-US"));
}

这不是最有效的方法(您可能希望为初学者缓存 CultureInfo 实例)但它会按照您的要求进行(即转换日期/从一种文化到另一种文化的时间字符串)。

但是,正如 cmets 中有人指出的那样,您不应该将日期 字符串 传递给 SQL 命令。相反,它们应该在 SQL 命令中定义为日期/时间参数:

using (var connection = new SqlConnection("<your connection string>"))
using (var command = connection.CreateCommand())
{
    command.CommandText = "INSERT INTO (sometable) VALUES (@somedatecolumn)";
    command.CommandType = CommandType.Text;

    var parameter = new SqlParameter("@somedatecolumn", SqlDbType.SmallDateTime);
    parameter.Value = <your date/time value>; // a DateTime value, not a string
    command.Parameters.Add(parameter);

    command.ExecuteNonQuery();
}

【讨论】:

  • 我也使用了这两个但同样的错误。我正在为 colmn 使用 smalldatetime,在程序中这有什么问题
【解决方案2】:

看来你应该只将 DateTimeFormatInfo 添加到你的 Convert.ToDateTime(inDate) --> Convert.ToDateTime(inDate, DateTimeFormatInfo)

        System.Globalization.DateTimeFormatInfo dtfi = null;
        DateTime dtProjectStartDate = new DateTime(2008, 4, 10); //year, month, day

        ci = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB"); 
        dtfi = ci.DateTimeFormat;

        txtBox.Text = dtProjectStartDate.ToString("d", dtfi); // 10/4/2008


        System.Globalization.CultureInfo ciForSQL = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
        System.Globalization.DateTimeFormatInfo dtfiForSQL = ciForSQL.DateTimeFormat;
        DateTime dtForSQL = Convert.ToDateTime(txtBox.Text, dtfiForSQL);
        txtBoxForSQL.Text = dtForSQL.ToString("d", dtfiForSQL); // 10/4/2008

【讨论】:

  • 简而言之:txtBox.Text = new DateTime(2012, 3, 14).ToString("d", new CultureInfo("en-GB")); //14/03/2012 txtBoxForSQL.Text = new DateTime(2012, 3, 14).ToString("d", new CultureInfo("en-US"));//2012/3/14
【解决方案3】:

使用..DateTime.ParseExact

DateTime.ParseExact("12/02/21 10:56:09", "yy/MM/dd HH:mm:ss", 
    CultureInfo.InvariantCulture
    ).ToString("MM/dd/yyyy");

【讨论】:

  • 将这个 m/d/y 字符串传递给 SQL Server 与传递原始 d/m/y 字符串一样危险。
  • 他没有在 Sql server 中询问,请参见示例。 @AaronBertrand
  • 这是一个 c# 方法,以特定格式将日期时间作为字符串返回。
  • 我的意思是你不想要一个字符串,OP 也不想要 - 他/她只是还没有意识到这一点。
  • @user3373573 “不工作”是什么意思? (另外,让我猜一下,你几天前写了这段代码,这是你第一次测试它是在一天> 12的时候?)