C# 如何正确解析此格式的DateTime:“;2013-04-29T00:00:00;

C# 如何正确解析此格式的DateTime:“;2013-04-29T00:00:00;,c#,parsing,datetime,C#,Parsing,Datetime,我使用一个web服务,它将一些日期作为字符串返回给我,我使用DateTime.Parse获取对应的DateTime对象。它正在工作,但我担心我对DateTime.Parse的使用可能容易受到由不同区域设置引起的错误的影响。返回的日期格式如下: 2014-04-24T00:00:00 我用来解析它的代码: DateTime d = DateTime.Parse(strValue); 是否有某种方式(例如传递格式提供程序或使用其他方法)可以保证我的解析例程在不考虑机器区域设置的情况下都能正常工作

我使用一个web服务,它将一些日期作为字符串返回给我,我使用
DateTime.Parse
获取对应的
DateTime
对象。它正在工作,但我担心我对
DateTime.Parse的使用可能容易受到由不同区域设置引起的错误的影响。返回的日期格式如下:

2014-04-24T00:00:00
我用来解析它的代码:

DateTime d = DateTime.Parse(strValue);

是否有某种方式(例如传递格式提供程序或使用其他方法)可以保证我的解析例程在不考虑机器区域设置的情况下都能正常工作?

如果要解析独立于用户区域设置的日期,请使用:


因为您有一个精确的格式,所以我将使用一个不含糊的格式字符串:

DateTime.ParseExact("2014-04-24T00:00:00", "yyyy\\-MM\\-dd\\THH\\:mm\\:ss", null)
// or to reduce the C#-escaped backslashes:
DateTime.ParseExact("2014-04-24T00:00:00", @"yyyy\-MM\-dd\THH\:mm\:ss", null)

转义的连字符和冒号以及转义的
T
,意味着它们是常量。因此,无论其他因素如何,这一行都应该有效。

您使用的是最短表单!您的格式是ISO 8601格式()。任何文化都承认它

  string dateString;
  DateTime dateValue;

  // Parse a string.
  dateString = "2014-04-24T00:00:00"; 
  if (DateTime.TryParseExact(dateString, "o",  CultureInfo.InvariantCulture, 
                DateTimeStyles.None, out dateValue))
   Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, 
             dateValue.Kind);
因此,您的方法是最简单的方法:
DateTime result=DateTime.Parse(“2008-06-15T21:15:07”)

如果不确定,请使用:
DateTime结果=DateTime.ParseExact(“2008-06-15T21:15:07”,“s”,null)

签出:

是的,您可以使用


其中“s”格式字符串表示可排序的日期时间(MSDN on)

这是ISO8601日期时间格式,不随机器设置而改变。传递文化不会造成伤害,但可以选择。还要注意的是,任何这些的结果都会有
.Kind
Unspecified
——这可能不是您所期望的。而“s”的大解决方案可能会短得多!如果“s”适合你,那就去做吧。但是,我觉得清楚地拼写出来对将来阅读您的代码或排除故障的任何人都有帮助。它消除了任何歧义,不依赖于任何内置标准——它只起作用,永远不会起作用,而且你永远不需要查看文档来找出它起作用或不起作用的原因。是的,你的答案会起作用,但它适用于任何文化。@MartinMulder不清楚你的意思。此代码在任何区域性上下文中的行为方式都相同:它将根据不变区域性解析数字,并忽略当前上下文的区域性规则。这似乎是OP想要的。是的,但这比他想要的要多。看看我的答案。他使用的文化并不重要(en-US、nl-nl、Invaruant等)。他使用的格式总是被正确解析,因此您不必显式提供区域性。这将失败,因为“o”格式需要小数点后七位小数秒。
  string dateString;
  DateTime dateValue;

  // Parse a string.
  dateString = "2014-04-24T00:00:00"; 
  if (DateTime.TryParseExact(dateString, "o",  CultureInfo.InvariantCulture, 
                DateTimeStyles.None, out dateValue))
   Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, 
             dateValue.Kind);
string dateString, format;  
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;

dateString = "2013-04-29T00:00:00";
format = "s";

result = DateTime.ParseExact(dateString, format, provider);