要從DateTime轉換成ISO8601的格式,在.NET中我們有幾種方式,一種是直接帶入ISO8601的Format,像是: var ISO8601String = dt.ToString(@“yyyy-MM-dd\THH:mm:ss\Z”);

一種是帶入s並在最後面加上"Z":

var ISO8601String = string.Format("{0}Z", dt.ToString(“s”));

最後一種是帶入o:

var ISO8601String = dt.ToString(“o”);

實際程式撰寫會像下面這樣:

        var dt = DateTime.UtcNow;
        Console.WriteLine(string.Format("{0}Z", dt.ToString("s")));
        Console.WriteLine(dt.ToString("o"));
        Console.WriteLine(dt.ToString(@"yyyy-MM-dd\THH:mm:ss\Z"));

運行後可以看到時間正確的轉換為ISO8601的格式:

若要從ISO8601的字串格式轉換回DateTime,可以使用DateTime.TryParseExact,將ISO8601的格式帶入,像是下面筆者所整理的函式一樣:

    static DateTime? ToDateTimeFromUTCISO8601(string dateTimeString)
    {
        DateTime dt;
        var sucessed = DateTime.TryParseExact(dateTimeString, new string[] { @"yyyy-MM-dd\THH:mm:ss\Z", "o" }, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out dt);

        return sucessed ? new DateTime?(dt) : null;
    }

使用起來會像下面這樣:

        var dt = ToDateTimeFromUTCISO8601(@"2010-08-20T15:00:00Z");
        var utcDT = dt.Value.ToUniversalTime();

        var dt = ToDateTimeFromUTCISO8601(@"2007-06-06T09:03:01.1234567+02:00");
        var utcDT = dt.Value.ToUniversalTime();