DateTimeをISO8601形式に変換する方法を見つけましたが、C#でその逆を行う方法については何もありません。
私は持っています、そしてそれをオブジェクト2010-08-20T15:00:00Z
に変えたいです。DateTime
弦の部分を自分で分離することもできますが、それはすでに国際標準になっているものにとっては大変な作業のようです。
このソリューションは、DateTimeStyles列挙を利用し、Zでも機能します。
DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
これにより、ソリューションが完全に印刷されます。
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」行を追加して、対象となる形式の変更の数を大幅に増やすことができます。
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);
true
DateTimeStyles.AssumeLocal
時間のゾーンによっては、同様に使用する必要がある場合があります...
これはLINQPad4で正常に機能します。
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));
DateTime.ParseExact(...)
各文字が何を表すかをパーサーに伝えることができます。