163

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

私は持っています、そしてそれをオブジェクト2010-08-20T15:00:00Zに変えたいです。DateTime

弦の部分を自分で分離することもできますが、それはすでに国際標準になっているものにとっては大変な作業のようです。

4

7 に答える 7

177

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

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

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

于 2010-08-24T12:02:56.387 に答える
41

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

于 2013-07-19T17:46:11.670 に答える
25
using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);
于 2010-08-24T12:08:31.017 に答える
21

これが私にとってよりうまく機能するものです(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
于 2011-05-13T16:36:49.013 に答える
9

動作させるには、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時間のゾーンによっては、同様に使用する必要がある場合があります...

于 2012-08-14T07:15:27.847 に答える
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"));
于 2012-12-18T01:43:57.077 に答える
-2

DateTime.ParseExact(...)各文字が何を表すかをパーサーに伝えることができます。

于 2010-08-24T12:00:33.233 に答える