如何在PC区域设置后将字符串解析为DateTime

时间:2013-09-13 10:05:30

标签: c# datetime string-formatting

以下代码:

string s = DateTime.Now.ToString();
DateTime dt;
DateTime.TryParse(s, out dt);

textBox1.AppendText(s + "\n");
textBox1.AppendText(DateTime.Now + "\n");
textBox1.AppendText(dt.ToString() + "\n");

DateTime.TryParse(s,
                  CultureInfo.CurrentCulture.DateTimeFormat,
                  DateTimeStyles.None,
                  out dt);
textBox1.AppendText(dt.ToString() + "\n");

在文本框中生成以下输出:

13.09.2013 1602.38
13.09.2013 1602.38
01.01.0001 0000.00
01.01.0001 0000.00

为什么TryParse无法解析字符串s以纠正DateTime对象?我希望我的程序能够正确解析格式为s的字符串。我怎么能这样做?

这是在.NET Framework 4上运行的C#WPF程序。

1 个答案:

答案 0 :(得分:2)

您的DateSeperatorTimeSeperator似乎相同。在这种情况下,它是.

DateTime转换为字符串框架时,只需将.放在那些分隔符的位置,这样转换为字符串就可以顺利进行。

但是当日期时间解析器找到DateTime字符时将其解析回.时,它没有任何线索来查找元素是Date part还是Time part。因此失败了。

以下是重现问题的片段,并显示修复程序。

        CultureInfo c = new CultureInfo("en-us", true);
        c.DateTimeFormat.DateSeparator = ".";
        //c.DateTimeFormat.TimeSeparator= ".";//this will fail
        c.DateTimeFormat.TimeSeparator= ":";//this will work since TimeSeparator and DateSeparator  are different.
        Thread.CurrentThread.CurrentCulture = c;

        string s = DateTime.Now.ToString();
        DateTime dt;
        DateTime.TryParse(s, out dt);

        Console.WriteLine(s + "\n");
        Console.WriteLine(DateTime.Now + "\n");
        Console.WriteLine(dt.ToString() + "\n");

        DateTime.TryParse(s,
                          CultureInfo.CurrentCulture.DateTimeFormat,
                          DateTimeStyles.None,
                          out dt);
        Console.WriteLine(dt.ToString() + "\n");

结论: 您不应将DateTimeFormatTimeSeparator设置为相同的值。这样做会给运行时解析DateTime带来麻烦,因此失败了。 :)