C# 如何根据PC区域设置将字符串解析为DateTime

C# 如何根据PC区域设置将字符串解析为DateTime,c#,datetime,string-formatting,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, CultureI

以下代码:

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程序。

您的
日期分隔符和
时间分隔符似乎是相同的。在这种情况下,它是

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

但是当DateTime解析器找到
字符时,将其解析回
日期时间
时,它不知道元素是
日期部分
还是
时间部分
。因此它失败了

下面是重现问题的代码段,并显示了修复方法

        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");
结论:
您不应将
DateTimeFormat
TimeSeparator
设置为相同的值。这样做会给运行时分析
DateTime
带来麻烦,因此它会失败。:)

您是否在styles参数上尝试了
AssumeLocal
?我在本地尝试了您的代码,但它在我的en GB语言环境下正常工作。您的代码对我来说运行良好,从您的输出来看,它就像是在这一行之前将
dt
设置为默认值
textBox1.AppendText(dt.ToString()+“\n”)
@AdamHouldsworth:我刚刚在上一个
TryParse
中尝试了
AssumeLocal
。输出仍然是一样的。我严重修改了电脑的日期和时间格式。您可以尝试修改电脑的日期和时间格式,看看代码是否仍然有效。@donotalo您当前的“本地”文化是什么?因此,我可以使用正确的区域性运行一些示例代码。另外,您还对操作系统上的日期/时间格式做了哪些其他修改?请在问题中详细说明。@Adamhuldsworth:我的电脑文化在美国被修改了。我修改了日期和时间格式,正如您在问题的前两个输出中所看到的。是的,我将时间格式更改为
HH,mm,ss
,并将日期格式保留在
dd.mm.yyyy
,这解决了问题。请注意,
HHmm,ss
的时间格式不会将
识别为时间分隔符。@Adamhuldsworth对此不确定。我认为更改时间格式在这里并不重要,日期和时间的分隔符更重要。我可能错了。我只是说我可以通过操作系统设置证明你的解决方案,但是我必须在
HH
mm
之间设置分隔符,这样它就可以被自动检测为分隔符,而不必像你的例子那样制作我自己的格式信息实例。@AdamHouldsworth得到了它。我觉得这样可以很容易地说明问题,而不是通过
ControlPanel
指向更改设置。我知道,我只是把它放在OPs原始问题的上下文中。