web-dev-qa-db-ja.com

ISO 8601形式から.NET DateTimeを作成する方法

DateTimeを ISO 8601 形式に変換する方法を見つけましたが、C#でその逆を行う方法は何もありません。

2010-08-20T15:00:00Zがあり、それをDateTimeオブジェクトに変換したい。

文字列の各部分を自分で分離することもできましたが、それはすでに国際標準となっているものの多くの作業のように思えます。

109
Ripter

このソリューションは DateTimeStyles 列挙を利用し、Zでも機能します。

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

これにより、ソリューションが完全に印刷されます。

127
Mamta D

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"行を追加して、対象となる形式の変更の数を大幅に拡張できます。

27
Alexey Biryukov
using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);
21
abatishchev

私にとってはうまくいくものがあります( LINQPad version):

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
16
Reb.Cabin

TryParseExactが機能するためには、ISO文字列の形式を正確に一致させることが重要と思われます。 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も使用する必要があります...

5

これは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"));
3
Zar Shardan