web-dev-qa-db-ja.com

ISO 8601形式のDateTimeオブジェクトを解析および生成する方法

このSOAP以下の形式で日時オブジェクトを送信するWebサービスがあります

2016-03-29T12:20:35.093-05:00

それは2016年3月29日です。時間:12:20:35.093(GMT-5)。

次のようにDateTimeオブジェクトを作成できるようにしたい:

DateTime.Now

上記の形式の文字列表現と逆の操作を取得し、上記のような文字列からDateTimeを作成します。

日付を作成するために次のことを試しました。

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)

ただし、そこにGMT-5を指定する方法がわかりません...

DateTimeを指定された文字列形式に変換する方法もわかりません。

ネイトのコードを使用して、私は次のことをしています:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)

ただし、この呼び出しは以下を返します:「2016-03-29T15:20:35Z」の代わりに:

"2016-03-29T12:20:35.093-03:00"

これが実際に必要なものです。

私はこれがうまくいくと思う:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")
14

説明する形式は ISO 8601 です。

タイムゾーンコンポーネントを含むタイムスタンプを使用しているため、DateTimeOffsetの代わりにDateTimeを使用することを強くお勧めします。物事がとても簡単になります!

特定の日付、時刻、およびタイムゾーンオフセットのDateTimeOffsetを作成するには、次の構文を使用します。

var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5));
// March 29, 2016 at 12:20:35.93 GMT-5

このコードは、DateTimeOffsetをISO 8601としてフォーマットします。

public static string FormatIso8601(DateTimeOffset dto)
{
    string format = dto.Offset == TimeSpan.Zero
        ? "yyyy-MM-ddTHH:mm:ss.fffZ"
        : "yyyy-MM-ddTHH:mm:ss.fffzzz";

    return dto.ToString(format, CultureInfo.InvariantCulture);
}

また、文字列を解析してDateTimeOffsetに戻すには:

public static DateTimeOffset ParseIso8601(string iso8601String)
{
    return DateTimeOffset.ParseExact(
        iso8601String,
        new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" },
        CultureInfo.InvariantCulture,
        DateTimeStyles.None);
}

DateTimeに戻る必要がある場合は、DateTimeOffset. UtcDateTime プロパティから取得できます。

24
Nate Barbettini

より簡単な方法は、DateTimeOffsetでToStringメソッドを「o」引数とともに使用することです。これにより、日付がISO8601形式で自動的に印刷されます

DateTimeOffset.Now.ToString("o");

静的解析メソッドは、ISO8601形式の日付を正しく解析することもできます。

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");
14

簡単な答え:DateTime.UtcNow.ToString("o")

0
Tim P.