2013-04-29 31 views
5

我消耗它返回我一些日期为字符串web服务,我用DateTime.Parse得到correspondente DateTime对象。它正在工作,但恐怕我的使用DateTime.Parse可能容易受到由不同区域设置引起的错误的影响。返回的日期是以下格式:如何正确地分析一个DateTime格式为:“2013-04-29T00:00:00”

2014-04-24T00:00:00 

我使用解析它的代码:

DateTime d = DateTime.Parse(strValue); 

是否有某种方式(如通过一个格式提供,或使用另一种方法),在该我保证我的解析例程可以工作,而不管机器语言环境设置如何?

+2

这是ISO8601日期时间格式,*不会根据机器设置而改变。传递文化不会伤害,但可选。 – 2013-04-29 19:39:24

+0

另外请注意,其中任何一个的结果都会有'.Kind'值为'Unspecified' - 这可能是也可能不是您所期望的。 – 2013-04-29 20:04:48

回答

5

如果你想解析日期独立用户的区域设置的,然后使用invariant culture

DateTime d = DateTime.Parse(strValue, CultureInfo.InvariantCulture); 
+0

是的,你的答案会起作用,但它可以适用于任何文化。 – 2013-04-29 19:50:24

+0

@MartinMulder目前还不清楚你的意思。这些代码在任何文化背景下都会表现出相同的方式:它会根据不变文化解析数字,并忽略当前上下文的文化规则。这似乎是OP所期望的。 – cdhowie 2013-04-29 19:51:51

+0

是的,但这比他想要的要多。看看我的答案。无论他使用何种文化(en-US,NL-NL,Invaruant等)都无关紧要。他使用的格式总是正确解析,所以你不必显式提供文化。 – 2013-04-29 19:53:22

1

既然你有一个确切的格式,我会使用一个无歧义格式字符串:

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意味着那些是不变的值。所以这条线应该工作,不管其他因素。

+0

一个很大的解决方案,而“s”会更短! – 2013-04-29 19:45:44

+1

如果“s”适合你,就去做吧。不过,我觉得将它拼出来的清晰度有助于任何人在将来阅读您的代码或进行故障排除。它消除了任何歧义,并且不依赖于任何内置标准 - 它只是起作用,并且永远不会工作,并且您永远不需要查看文档以找出它为什么起作用或不起作用。 – 2013-04-29 20:13:22

0
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); 
+0

这会失败,因为“o”格式需要小数秒的七位小数。 – 2013-04-29 19:56:16

1

是的,你可以使用DateTime.ParseExact

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

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

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

其中“s”格式字符串表示可排序的DateTime(位于上的MSDN 210)

相关问题