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原始问题的上下文中。