尝试将string
转换为DateTime
时遇到错误,即使此操作以前一直有效。
这是我使用的程序:
将日期时间保存到文本文件中,如下所示:
DateTime.Now.ToUniversalTime().ToString(); //results in something like this 20.9.2015 10.16.12
关于应用程序加载:
string s = streamReader.ReadLine(); //the saved string s = "20.09.2015 10.16.12"
DateTime d = Convert.ToDateTime(s);
结果如下:
字符串未被识别为有效的DateTime。
在安装Windows 10和Visual Studio 2015之前,我从未遇到过这个问题,我之前的设置是Windows 7和Visual Studio 2013.奇怪的是,这也会导致同样的错误:
DateTime d = Convert.ToDateTime(DateTime.Now.ToUniversalTime().ToString());
这在我之前的设置中完美运行,任何想法为什么它不再起作用了?
编辑:我确实认为这个问题与Thomas Weller链接到的将字符串转换为DateTime的问题不重复。由于此问题是预期行为更改的结果,请参阅第二个示例。我也确实找到了解决方法,但这不实用:
string s = DateTime.Now.ToUniversalTime().ToString();
s = s.Substring(0, s.IndexOf(" ")).Replace('.', '/') + s.Substring(s.IndexOf(" ")).Replace('.', ':');
DateTime d = Convert.ToDateTime(s);
答案 0 :(得分:3)
由于您在控制面板上进行区域设置,这可能不再有效。
为避免与目标环境中的区域设置发生冲突,请使用DateTime.TryParseExact:
string s = streamReader.ReadLine(); //the saved string s = "20.09.2015 10.16.12"
DateTime d = DateTime.Now;
DateTime.TryParseExact(s, "dd.MM.yyyy HH.mm.ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out d);
另外,如果这是您的默认格式,并且整个应用程序需要此格式,you can set the default culture on your config file。
此代码:
Convert.ToDateTime(DateTime.Now.ToUniversalTime().ToString())
一旦没有格式提供者的DateTime.ToString()和Convert.ToDateTime()使用相同的DateTimeFormatInfo,除非您在这些调用之间更改文化,否则应该适用于任何环境。请注意,没有格式说明符will use General date/time pattern (G)的DateTime.ToString()基于current culture。和Convert.DateTime没有FormatProvider will use current culture too(在MSDN上检查这些引用)。
我的最后一个建议是,您可以这样做:
,而不是替换string s = DateTime.Now.ToUniversalTime().ToString("dd/MM/yyyy HH:mm:ss");
答案 1 :(得分:1)
我尝试在控制台应用程序中使用代码,它对我有用。并检查.NETFiddle here
string s = "20.09.2015 10.16.12";
DateTime d;
bool isValid = DateTime.TryParseExact(s, "dd.MM.yyyy HH.mm.ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out d);
尝试了解TryParseExact的工作原理。您可以阅读TryParseExact
和格式here。如果成功转换值,则返回true
,否则返回false
。
答案 2 :(得分:0)
请试试这个。
CultureInfo objcul = new CultureInfo("en-GB");
DateTime.ParseExact(ValidFrom.Text,"dd/MM/yyyy", objcul);