簡體   English   中英

將 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 對象。

我做錯了什么?

您應該使用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解析數據,則應自動識別該格式。 您只需使用DateTimeDateTimeOffset屬性,它就會毫無問題地解析它。

您的格式字符串中有一個錯誤。 這是一個工作示例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM