DateTimeをISO 8601形式に変換する方法はわかりましたが、C#でその逆を行う方法はありません。
私は持っていて2010-08-20T15:00:00Z
、それをDateTime
オブジェクトにしたいのです。
文字列の部分を自分で分離することもできましたが、それはすでに国際標準となっているものに対しては多くの作業のように思えます。
DateTimeをISO 8601形式に変換する方法はわかりましたが、C#でその逆を行う方法はありません。
私は持っていて2010-08-20T15:00:00Z
、それをDateTime
オブジェクトにしたいのです。
文字列の部分を自分で分離することもできましたが、それはすでに国際標準となっているものに対しては多くの作業のように思えます。
回答:
このソリューションは、DateTimeStyles列挙を利用し、Zでも機能します。
DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
これにより、ソリューションが完全に印刷されます。
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
うまく機能しているようです。
DateTimeStyles.RoundtripKind?
MSDNの説明について詳しく説明したい人は誰もいません。
2018-06-19T14:56:14.123Z
UTCではなく現地時間として解析されます。CultureInfo.InvariantCulture
nullの代わりに使用します。
DateTimeStyles.RoundTripKind
、stackoverflow.com / q / 39572395/2014893
MSDNでは、「s」および「o」のフォーマットは標準を反映していると述べていますが、それらはその限られたサブセットしか解析できないようです。特に文字列にタイムゾーンの指定が含まれている場合は問題です。(基本的なISO8601形式でも精度の低い形式でもありませんが、これは厳密にはそうではありません。)そのため、ISO8601の解析に関してカスタム形式の文字列を利用します。現在のところ私が好むスニペットは:
static readonly string[] formats = {
// Basic formats
"yyyyMMddTHHmmsszzz",
"yyyyMMddTHHmmsszz",
"yyyyMMddTHHmmssZ",
// Extended formats
"yyyy-MM-ddTHH:mm:sszzz",
"yyyy-MM-ddTHH:mm:sszz",
"yyyy-MM-ddTHH:mm:ssZ",
// All of the above with reduced accuracy
"yyyyMMddTHHmmzzz",
"yyyyMMddTHHmmzz",
"yyyyMMddTHHmmZ",
"yyyy-MM-ddTHH:mmzzz",
"yyyy-MM-ddTHH:mmzz",
"yyyy-MM-ddTHH:mmZ",
// Accuracy reduced to hours
"yyyyMMddTHHzzz",
"yyyyMMddTHHzz",
"yyyyMMddTHHZ",
"yyyy-MM-ddTHHzzz",
"yyyy-MM-ddTHHzz",
"yyyy-MM-ddTHHZ"
};
public static DateTime ParseISO8601String ( string str )
{
return DateTime.ParseExact ( str, formats,
CultureInfo.InvariantCulture, DateTimeStyles.None );
}
TZなしの文字列の解析を気にしない場合(私はそうします)、「s」行を追加して、対象となるフォーマット変更の数を大幅に拡張できます。
"yyyyMMdd"
しformats
ます。
K
すると、さまざまなタイムゾーンの処理をまとめて行うことができます。私はstackoverflow.com/a/31246449/400547でより広範なバリアントを持っていますが、それはあまりにも広範囲である場合(有効なISO 8601であるが、より一般的なプロファイルでは使用されないものを受け入れます)ですがK
、第三。
using System.Globalization;
DateTime d;
DateTime.TryParseExact(
"2010-08-20T15:00:00",
"s",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal, out d);
これは私にとってよりうまくいくものです(LINQPadバージョン):
DateTime d;
DateTime.TryParseExact(
"2010-08-20T15:00:00Z",
@"yyyy-MM-dd\THH:mm:ss\Z",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal,
out d);
d.ToString()
作り出す
true
8/20/2010 8:00:00 AM
が機能するには、ISO文字列の形式を正確に一致させることが重要と思わTryParseExact
れます。ExactはExactであり、この答えはほとんどの人にとって明白ですが、とにかく...
私の場合、Reb.Cabinの回答は機能しません。これは、以下の「値」に従って入力がわずかに異なるためです。
値: 2012-08-10T14:00:00.000Z
ミリ秒の間、そこに余分な000がいくつかありますが、それ以上の場合もあります。
しかし、.fff
以下に示すようにフォーマットにいくつかを追加すると、すべて問題ありません。
フォーマット文字列: @"yyyy-MM-dd\THH:mm:ss.fff\Z"
VS2010イミディエイトウィンドウ:
DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);
本当
あなたのDateTimeStyles.AssumeLocal
時間はどのゾーンであるかに応じて使用する必要があるかもしれません...
AssumeUniversal
する必要がありましたAdjustToUniversal
。
DateTime.ParseExact(...)
各文字が何を表すかをパーサーに伝えることができます。