/ / ISO 8601形式のDateTimeオブジェクトを解析して生成する方法 - c#、.net、datetime、iso8601

どのように解析し、ISO 8601形式でDateTimeオブジェクトを生成する - c#、.net、datetime、iso8601

このSOAP Webサービスでは、datetimeオブジェクトを次の形式で送信します

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を指定された文字列形式に変換する方法もわかりません。

Nateのコードを使用すると、以下のことができます。

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")

回答:

回答№1の22

あなたが書いているフォーマットは、 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 プロパティ。


回答№2の13

簡単な方法は、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");

回答№3の場合は0

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