DateTime.ParseExact,格式为字符串,格式为2012-08-17T04:39:51.215Z

时间:2013-02-06 04:57:46

标签: c# .net parsing datetime

我正在开发我的第一个完整的C#项目。我正在为Windows应用商店应用/ Windows Phone应用编写一个可移植的类库,而我实际上只遇到了DateTime.ParseExact和DateTime.TryParseExact。

我试图转换为DateTime的字符串实际上是在Zulu中。示例如下所示:

 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 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

解决方案

在Jeremy Thompson的帮助下,我实际上能够调试自己的错误。事实证明这是我第一次使用.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 个答案:

答案 0 :(得分: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

  

使用默认值解析字符串参数。没有空白区域   允许使用格式以外的格式。如果字符串缺少日期   component,返回的DateTime值的日期设置为1/1/0001。

我看到你正在提供Date组件。我唯一的猜测是我在澳大利亚并且它有效,我们使用DD-MM-YYYY,在美国使用MM-DD-YYYY。也许翻转它,看看是否有效,例如:

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