2013-02-06 32 views
0

我正在处理我的第一个完整的C#项目。我正在为Windows应用程序/ Windows Phone应用程序编写一个可移植的类库,并且实际上遇到了只有DateTime.ParseExact和DateTime.TryParseExact的问题。DateTime.ParseExact与字符串格式2012-08-17T04:39:51.215Z

我试图转换为DateTime的字符串其实是祖鲁语。这个例子看起来像这样:

2012-09-14T04:42:25.117Z 
2012-08-17T04:39:51.215Z 

正如你所看到的,我们在这里得到毫秒。以下是正在使用的代码:

DateTime _createdAt = DateTime.ParseExact(dateTime, TIMEFORMATTER, 
           CultureInfo.InvariantCulture, 
           DateTimeStyles.AssumeUniversal); 

     return _createdAt; 

而且TIMEFORMATTER是一个const声明往上顶:

const string TIMEFORMATTER = "yyyy-MM-ddTHH:mm:ss.fffZ" 

我一直在阅读一些SO职位寻找的东西,解决它的。我认为this一个会好,但它没有。

如果任何人都可以指出我在正确的方向,我将不胜感激。我只使用VB.net中的Date对象。

编辑:从库中添加额外的代码来显示完整的解释

if (details.ContainsKey("created_at")) 
{ 
    var time = details["created_at"].Stringify(); 
    Debug.WriteLine(time); 
    DateTime _createdAt = FormatDateTime(time); 

    Debug.WriteLine(_createdAt.ToLocalTime()); 
    Asana.Projects[indexOfProject].CreatedAt = _createdAt; 
} 



public static DateTime FormatDateTime(string dateTime) 
{ 
    DateTime _createdAt = new DateTime(); 
    // 2012-09-14T04:42:25.117Z 
    DateTime.TryParse(dateTime, out _createdAt); 

    return _createdAt; 
} 

这是去调试:

"2012-08-17T04:39:52.878Z" 
1/1/0001 12:00:00 AM 
"2012-08-17T05:17:12.530Z" 
1/1/0001 12:00:00 AM 
"2012-09-09T04:23:08.805Z" 
1/1/0001 12:00:00 AM 
"2012-08-17T04:39:51.215Z" 
1/1/0001 12:00:00 AM 
"2012-09-14T05:12:22.056Z" 
1/1/0001 12:00:00 AM 
"2012-08-06T04:51:10.662Z" 
1/1/0001 12:00:00 AM 
"2012-09-14T04:40:56.602Z" 
1/1/0001 12:00:00 AM 
"2012-08-17T04:52:33.264Z" 
1/1/0001 12:00:00 AM 
"2012-09-14T04:43:50.953Z" 
1/1/0001 12:00:00 AM 
"2012-09-13T06:07:16.530Z" 
1/1/0001 12:00:00 AM 
"2012-09-14T04:42:25.117Z" 
1/1/0001 12:00:00 AM 

解决方案

随着杰里米汤普森的帮助下,我实际上能够调试我自己的错误。原来,这是我第一次使用.Net中的JSON数据(习惯于Python)。

.Stringify()和.GetString()在获取字符串文本时做了完全不同的事情。我打开了一个新的控制台程序,并使用Jeremy的代码来产生他所做的相同结果。完美无瑕地工作。当我回到我的图书馆时,我收到了一些我正在回来的字符串的格式问题。然后它在我的调试窗口中引起我的注意,它引用了JSON数据。

的新的工作代码如下:

// From the depths of a method 
if (details.ContainsKey("created_at")) 
{ 
    var time = details["created_at"].GetString(); 
    DateTime _createdAt = FormatDateTime(time);     
    Asana.Projects[indexOfProject].CreatedAt = _createdAt; 
    Debug.WriteLine(Asana.Projects[indexOfProject].CreatedAt.ToLocalTime()); 
} 

而新的FormatDateTime方法(不是新事实证明...):

public static DateTime FormatDateTime(string dateTime) 
{ 
    DateTime _createdAt = new DateTime(); 
    DateTime.TryParseExact(dateTime, TIMEFORMATTER, CultureInfo.InvariantCulture,                 
          DateTimeStyles.AssumeUniversal, out _createdAt);    
    return _createdAt; 
} 

一些示例输入/输出:

2012-09-14T04:43:42.060Z 
9/13/2012 10:43:42 PM 
2012-09-09T04:23:08.805Z 
9/8/2012 10:23:08 PM 
2012-08-06T04:51:10.662Z 
8/5/2012 10:51:10 PM 

非常感谢那些正在寻找和思考的人。

+1

你得到一个错误的东西?此外,C#中的Date对象与VB.net中的Date对象相同。 –

+1

根据您链接到的SO帖子以及您自己的TIMEFORMATTER,您是否试图在T中包含T和Z,如 const字符串TIMEFORMATTER =“yyyy-MM-dd'T'HH:mm:ss .fff'Z'“? – Riaan

+0

我忘了添加异常: '在mscorlib.dll中发生'System.FormatException'类型的第一次机会异常' 这是formatter的问题。我还试图做一个版本,其中包含''yyyy-MM-dd'T'HH:mm:ss.fff'Z'''和小写字母z,正如其他SO问题所暗示的。 – cdownard

回答

0
string stringdate = "2012-09-14T04:42:25.117Z"; 
DateTime date = new DateTime(); 
DateTime.TryParse(stringdate,out date); 
MessageBox.Show(date.ToShortDateString()); 

例如:

MessageBox.Show(date.ToLocalTime().ToString()); 

enter image description here

编辑:

MSDN DateTime.TryParseExact Method

字符串参数使用默认值进行分析。不允许使用除格式以外的空格 。如果字符串缺少日期 组件,则返回的DateTime值的日期设置为1/1/0001。

我看到你在提供Date组件。我唯一的猜测是,我在澳大利亚,它的工作原理,我们使用DD-MM-YYYY,在美国使用MM-DD-YYYY。也许翻转过来,并看看是否能工程,如:

“2012-17-08T04:39:52.878Z”

+1

'“2012-08-17T04:39:52.878Z”' '1/1/0001 12:00:00 AM' 第一个是我从API刮取的json字符串。第二个是在完成DateTime.TryParse之后返回的内容。我不知道为什么它不适合我。我很高兴发布更多的代码。 – cdownard

+0

这给了我:2012年8月17日下午2时39分52秒,所以你转换祖鲁日期时间和你在美国,我下了。为我工作不适合你。这很奇怪,让我想想还有什么可能。 –

+0

var time = details [“created_at”]。Stringify(); Debug.WriteLine(time); DateTime _createdAt = FormatDateTime(time); Debug.WriteLine(_createdAt。ToLocalTime());' 'public static DateTime FormatDateTime(string dateTime) { DateTime _createdAt = new DateTime(); // 2012-09-14T04:42:25.117Z DateTime.TryParse(dateTime,out _createdAt); return _createdAt; }' 给我这两行 ' “2012-08-17T04:39:52.878Z”'使用TryParseExact时发生 '1/1/0001 12:00:00 AM' – cdownard