将 2015-06-01T02:31:00+0000 转换为 DateTime 对象 c#

Convert 2015-06-01T02:31:00+0000 to DateTime object c#

我正在编写一个使用此网络服务的应用程序:

http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json

如您所见,JSON 对象带有一个 utc 日期时间字段。我想将此信息保存在一个简单的 DateTime 对象中,格式如下 "yyyy-MM-dd HH:mm:ss".

这是我的代码:

 DateTime dateParsed = DateTime.Now;       
 DateTime.TryParseExact((string)resource.SelectToken("resource").SelectToken("fields")["utctime"], "yyyy'-'MM'-'dd'T'HH':'mm':'ssz", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal, out dateParsed);

我正在获取一个在 0001 年初始化的 DateTime 对象。

我做错了什么?

您的格式字符串中有一个错误。这是一个工作示例:

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        DateTime dateParsed = DateTime.Now; 
        if ( DateTime.TryParseExact( "2015-06-01T02:31:00+0000", "yyyy-MM-ddThh:mm:ss+0000", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal, out dateParsed ) ) {
            Console.WriteLine(string.Format("Parsing done: {0:MM/dd/yyyy @ hh:mm}", dateParsed ) );
        } else {
            Console.WriteLine("No result");
        }
    }
}

注意:+0000 是硬编码的,当您获得其他值时,您需要检测它们。如果 api returns 只有 +0 值,你可以切断它们并在没有 z 的情况下工作。

您应该使用 the K custom format specifier(而不是 z)。

string s = "2015-06-01T04:41:10+0000";

DateTime dt = DateTime.ParseExact(s, "yyyy-MM-dd'T'HH:mm:ssK",
                                  CultureInfo.InvariantCulture,
                                  DateTimeStyles.AdjustToUniversal);

它将读取 +0000 作为偏移量。然后通过使用 AdjustToUniversal 样式,生成的 DateTime 是世界时,具有 DateTimeKind.Utc.

此外,由于您是从已知数据源读取数据,因此使用 TryParseExact 并没有真正的好处。您的数据源的格式是固定的,因此只需使用 ParseExact 和该格式。 Try... 方法主要用于验证用户输入,或者当源格式可能不同时。

最后一点 - 如果您只是使用 JSON.net 解析您的数据,该格式应该会被自动识别。您只需使用 DateTimeDateTimeOffset 属性,它就会毫无问题地解析它。