[英]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 对象。
我做错了什么?
您应该使用K
自定义格式说明符(而不是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解析数据,则应自动识别该格式。 您只需使用DateTime
或DateTimeOffset
属性,它就会毫无问题地解析它。
您的格式字符串中有一个错误。 这是一个工作示例:
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 仅返回 +0 值,您可以将它们切断并在没有 z 的情况下工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.