C# 在时间格式中将连字符用作分隔符时,DateTime.Parse失败

C# 在时间格式中将连字符用作分隔符时,DateTime.Parse失败,c#,.net,datetime,.net-4.5,C#,.net,Datetime,.net 4.5,先决条件: 在Windows区域设置中,选择英语(美国)格式。在附加设置中,通过指定连字符作为分隔符(如“HH-mm-ss”)自定义时间格式 进行这些更改后,以下代码将失败,并出现FormatException(字符串未被识别为有效的日期时间): 转载于.NET 4.0和4.5。 有没有办法避免这个问题?您可以使用DateTime.ParseExact方法。 例如: DateTime.ParseExact(DateTime.Now.ToString(),"HH-mm-ss",null); 您可

先决条件: 在Windows区域设置中,选择英语(美国)格式。在附加设置中,通过指定连字符作为分隔符(如“HH-mm-ss”)自定义时间格式

进行这些更改后,以下代码将失败,并出现FormatException(字符串未被识别为有效的日期时间):

转载于.NET 4.0和4.5。
有没有办法避免这个问题?

您可以使用DateTime.ParseExact方法。 例如:

DateTime.ParseExact(DateTime.Now.ToString(),"HH-mm-ss",null);

您可以使用DateTime.ParseExact方法。 例如:

DateTime.ParseExact(DateTime.Now.ToString(),"HH-mm-ss",null);

也许这是显而易见的,但不是:

DateTime.Parse(DateTime.Now.ToString())
只要这样做:

DateTime.Now
字符串格式可以用于很多事情,但并不是所有格式在转换为字符串并再次解析回
DateTime
时都能保证完全往返。您可能已经特别注意到,因为时间分隔符被弄脏了,但这也是因为您使用的是默认的字符串格式。如果您使用此选项,即使在奇怪的区域设置下,它也会起作用:

DateTime.Parse(DateTime.Now.ToString("o"))
但是,在现实世界中,几乎没有一个好的理由这样做


您可能想阅读有关
DateTime

的字符串和格式的信息,这可能是显而易见的,但不是:

DateTime.Parse(DateTime.Now.ToString())
只要这样做:

DateTime.Now
字符串格式可以用于很多事情,但并不是所有格式在转换为字符串并再次解析回
DateTime
时都能保证完全往返。您可能已经特别注意到,因为时间分隔符被弄脏了,但这也是因为您使用的是默认的字符串格式。如果您使用此选项,即使在奇怪的区域设置下,它也会起作用:

DateTime.Parse(DateTime.Now.ToString("o"))
但是,在现实世界中,几乎没有一个好的理由这样做


您可能想了解
DateTime

HH mm ss
不是DateTime的格式和字符串。日期Time.DateTime.Now.ToString()返回类似于“10/12/2013 15-30-32”的内容。“10/12/2013 15-30-32”包含日期和时间。此外,只解析日期或只解析时间字符串是完全合法的。例如,DateTime.Parse(“10/12/2013”)得到{10/12/2013 12-00-00 AM}。Parse(“3:45:30 PM”)使用连字符获取{10/12/2013 3-45-30 PM}是一个非常尴尬的选择,它还匹配负数符号。在几分钟或几秒钟内,DateTime.Parse()无法再将分隔符与(不正确的)负值区分开来。这完全符合我的医生通常的建议:如果疼痛,就不要这样做。我认为任何强制格式都是一个非常尴尬的选择。因此,我想使用Windows区域设置中指定的格式。此外,用户可能会使用其区域性允许的不同格式(如HH:mm和HH:mm:ss),因此我不能只使用
DateTime.ParseExact(DateTime.Now.ToString(“G”),“G”,CultureInfo.CurrentCulture)
HH-mm-ss
不是日期时间。日期Time.DateTime.Now.ToString()返回类似于“10/12/2013 15-30-32”的内容。“10/12/2013 15-30-32”包含日期和时间。此外,只解析日期或只解析时间字符串是完全合法的。例如,DateTime.Parse(“10/12/2013”)得到{10/12/2013 12-00-00 AM}。Parse(“3:45:30 PM”)使用连字符获取{10/12/2013 3-45-30 PM}是一个非常尴尬的选择,它还匹配负数符号。在几分钟或几秒钟内,DateTime.Parse()无法再将分隔符与(不正确的)负值区分开来。这完全符合我的医生通常的建议:如果疼痛,就不要这样做。我认为任何强制格式都是一个非常尴尬的选择。因此,我想使用Windows区域设置中指定的格式。此外,用户可能会使用其区域性允许的不同格式(如HH:mm和HH:mm:ss),因此我不能只使用
DateTime.ParseExact(DateTime.Now.ToString(“G”),“G”,CultureInfo.CurrentCulture)
。是否存在某种DateTime.ParseUsingCustomSettings()方法?虽然这是一个有趣的解决方案,但它看起来很脆弱。您可以将TryParseExact方法与字符串格式数组一起使用,返回值是一个布尔值,指示解析是否成功。这里有一个文档:那么你需要什么呢?这取决于文化?您可以这样做,检查这里的重载:您也可以在常规解析方法中这样做。是否有某种DateTime.ParseUsingCustomSettings()方法?虽然这是一个有趣的解决方案,但它看起来很脆弱。您可以将TryParseExact方法与字符串格式数组一起使用,返回值是一个布尔值,指示解析是否成功。这里有一个文档:那么你需要什么呢?这取决于文化?您可以这样做,检查这里的重载:您也可以在常规解析方法中这样做。
DateTime.Parse(DateTime.Now.ToString())
是一个简化的示例。考虑一个应用程序,它为用户提供输入日期和时间的能力。当应用程序启动时,它将存储的DateTime值转换为文本并加载到文本框中,然后用户可以修改该值,应用程序应将其转换回DateTime。在这种情况下,当使用连字符作为分隔符时,用户将无法修改输入的日期和时间。此外,我还使用WPFToolkit()中的TimePicker复制了这个问题。如果连字符同时是日期和时间分隔符,您希望
DateTime.Parse(“1-2-3”)
如何区分0003年1月2日(日期)和01:02:03(时间)?我认为您的期望是不合理的。
DateTime.Parse(DateTime.Now.ToString())
是一个简化的示例。考虑一个应用程序,它为用户提供输入日期和时间的能力。当应用程序启动时,它将存储的DateTime值转换为文本并加载到文本框中,然后用户可以修改该值,应用程序应将其转换回DateTime。在这种情况下,用户将无法修改输入的日期和时间