【问题标题】:DateTime.ParseExact with string in format 2012-08-17T04:39:51.215ZDateTime.ParseExact,字符串格式为 2012-08-17T04:39:51.215Z
【发布时间】:2013-01-21 05:25:09
【问题描述】:

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

我试图转换为 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

解决方案

在 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

非常感谢那些关注和思考它的人。

【问题讨论】:

  • 您是遇到错误还是什么?此外,C# 中的 Date 对象与 VB.net 中的相同。
  • 根据您链接到的 SO 帖子和您自己的 TIMEFORMATTER,您是否尝试将 T 和 Z 包含在 '' 中,如 const string TIMEFORMATTER = "yyyy-MM-dd'T 'HH:mm:ss.fff'Z'"?
  • 我忘了添加异常:A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 这是格式化程序的问题。正如其他 SO 问题所建议的那样,我还尝试制作一个具有 "yyyy-MM-dd'T'HH:mm:ss.fff'Z'" 和小写 z 的版本。
  • 使用我的Date.TryParse 方法将克服异常并且仍然​​给你毫秒。刚刚看到链接,你找不到比 Jon 更好的建议了。为什么当你遵循他的方法时它不起作用???
  • 我在帖子中添加了额外的代码 sn-ps 以提供更多信息。

标签: c# .net parsing datetime


【解决方案1】:
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());

编辑:

MSDN DateTime.TryParseExact Method

使用默认值解析字符串参数。没有空格 格式中存在的内容除外。如果字符串缺少日期 组件,返回的 DateTime 值的日期设置为 1/1/0001。

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

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

【讨论】:

  • "2012-08-17T04:39:52.878Z" 1/1/0001 12:00:00 AM 第一个是我从 API 中获取的 json 字符串。第二个是执行 DateTime.TryParse 后返回的内容。我不确定为什么它对我不起作用。我很高兴发布更多代码。
  • 这给了我:2012 年 8 月 17 日下午 2:39:52,所以你正在转换 Zulu 日期时间和你在美国的时间,我很失望。为我工作对你不起作用。真奇怪,让我想想还有什么可能。
  • 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" 1/1/0001 12:00:00 AM
  • 使用 TryParseExact 时会出现相同的结果,如下所示DateTime.TryParseExact(dateTime, TIMEFORMATTER, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out _createdAt); 这个问题对我来说很奇怪,但我一定只是在做一些不正确的简单事情。
  • 我刚刚用string d = "2012-17-08T04:39:52.878Z"; DateTime date = new DateTime(); DateTime.TryParse(d, out date); Debug.WriteLine(date.ToString()); 测试了“2012-17-08T04:39:52.878Z”,我得到了相同的 1/1/0001 12:00:00 AM 日期。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多