3

我想将字符串“30/12/2012”转换为“2012/12/30”。我的应用程序设置为“en-CA”,但数据库默认接受 yyyy/MM/dd。

如何在不依赖服务器上设置的当前文化信息的情况下做到这一点?

4

6 回答 6

13

正如所有评论所说,但到目前为止没有一个答案说:不要将它作为 string 传递给数据库

尽早解析您收到的任何文本,然后在其他任何地方使用DateTime来表示它,包括您如何通过参数化 SQL 1将其发送到数据库。这适用于所有类型的值:尽快将其转换为数据的“自然”类型,并尽可能长时间地保持这种自然表示。日期不是字符串,只有在确实需要时才应将其转换为字符串 - 理想情况下在将其显示给用户之前。

解析可以使用DateTime.ParseExactDateTime.TryParseExact取决于这是“可疑”数据(例如来自用户)还是应该真正正确并且异常是对不可解析值的最适当反应的数据。CultureInfo.InvariantCulture我建议您使用自定义格式字符串传入。例如:

DateTime date = DateTime.ParseExact(text, "dd/MM/yyyy",
                                    CultureInfo.InvariantCulture);

(如果你做了很多日期/时间工作,你可能还想考虑使用我的Noda Time 项目,它可以让你以更丰富的方式表达价值——在这种情况下,你可能会使用LocalDate.)


1如果您尚未使用参数化 SQL,而是将值直接烘焙到 SQL 中,那么您遇到的问题比日期/时间转换更大。

于 2012-06-20T05:51:03.640 回答
4

您可以在 Format 和大多数 ToString 函数中指定 CultureInfo。

DateTime.ToString(CultureInfo)DateTime.Parse(string, CultureInfo)将让您在一种文化(即当前或new CultureInfo("en-CA"))中解析字符串并使用另一种类似的格式new CultureInfo("en-us")

注意:您可以考虑通过设置 Thread.CurrentCulture 在其他文化(即en-US)下运行所有​​数据库访问,因为有时数字格式也会受到影响(如果数字存储为字符串)。

于 2012-06-20T05:29:13.537 回答
3

如果它总是采用相同的格式。然后在/角色上拆分

string[] tempsplit = datestring.Split('/');

然后把它放回去

string joinstring = "/";
string newdate = tempsplit[2] + joinstring + tempsplit[1] + joinstring + tempsplit[0];

简单的。

于 2012-06-20T05:32:54.293 回答
2

首先使用将您的字符串转换为 DateTime 格式

DateTime dt = Convert.ToDateTime("your string value");

然后使用以下命令将其保存在字符串中:

string st=dt.ToString("yyyy/MM/dd");

这会将您的日期格式转换为您想要的任何所需格式,而不取决于文化

于 2012-06-20T05:45:19.043 回答
1

这似乎有效。

        var x = new string[] { "2012/06/12", "20/06/2012", "111/111/1111" };
        foreach (var ds in x)
        {
            DateTime d = default(DateTime);
            try
            {
                d = DateTime.Parse(ds, CultureInfo.GetCultureInfo("en-CA"));
            }
            catch (Exception ex)
            {
                try
                {
                    d = DateTime.ParseExact(ds, "yyyy/MM/dd", CultureInfo.InvariantCulture);
                }
                catch
                {
                }
            }
            if (d == default(DateTime))
                Console.WriteLine("error");
            else
                Console.WriteLine(d.ToString());
        }
于 2012-06-20T05:34:38.513 回答
1

无需讨论数据库接受或不接受什么格式的问题,您可以像这样进行转换:

  • 将字符串转换为日期时间,如此处所述
  • 像这样更改格式并再次将其转换为字符串
于 2012-06-20T05:35:36.553 回答