2017-11-06 4 views
2

.NETに次の出力を作成させることはできますか?もちろんDateformat ISO 8601で.NET CultureInfoを作成するには?

DateTime.UtcNow.ToString() --> "2017-11-07T00:40:00.123456Z" 

のToString( "S")またはToStringメソッドを使用する可能性は常にあります( "YYYY-MM-DD T HH:MM:ss.fffffffKは")。しかし、パラメータのないToString-Methodのデフォルト動作を目的の出力に調整する方法はありますか?

私はCurrentCultureを変更しようとしました。しかし、私が得たベストは "2017-11-07 00:40:00.123456Z"でした。スペースから "T"までの日付と時刻の区切り記号を変更する方法が見つかりませんでした。

答えて

4

すべての場合に動作することが保証されていない、リフレクションによって内部フィールドにアクセスすることによってのみ可能です。 ISO 8601仕様はスペースがTの代わりに使用できるようにするん

var culture = (CultureInfo) CultureInfo.InvariantCulture.Clone(); 
var field = typeof(DateTimeFormatInfo).GetField("generalLongTimePattern", 
              BindingFlags.NonPublic | BindingFlags.Instance); 
if (field != null) 
{ 
    // we found the internal field, set it 
    field.SetValue(culture.DateTimeFormat, "yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK"); 
} 
else 
{ 
    // fallback to setting the separate date and time patterns 
    culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"; 
    culture.DateTimeFormat.LongTimePattern = "HH:mm:ss.FFFFFFFK"; 
} 
CultureInfo.CurrentCulture = culture; 

Console.WriteLine(DateTime.UtcNow); // "2017-11-07T00:53:36.6922843Z" 

注意。 Tを使用するのはちょうどです。です。

+0

ありがとうございました!とにかく私はこれを使用して快適に感じていないので、私はそれをやっていません。 誰かが興味を持っている場合:上記のフィールドは、一度も変更されていないdatetime-formatの内部 "キャッシュ"です。 https://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeformatinfo.cs,a1da93c5a4a8c4e3 – Andreas

+0

ええ、実際にこれを行うことは絶対にお勧めします。適切な書式指定で 'ToString'を使うだけです。これを隠すことはおそらく最良のアイデアではないでしょう。うんざりした回避策のためにピンチで良いかもしれないが、それを回避しようとする。 :) –

0

Scott Hanselmannがブログhereに投稿しました。

少しReflectoringは、System.DateTime.ToString( "G")のようにSystem.DateTimeのデフォルトの書式文字列が "G"であることを示しています(Gはプリセットの1つです)。

[...]

そして、 "G" はShortDate組み合わせ長年であることを示す、彼は期待した出力を取得します。

だから、オーバーライドする必要がありますShortDatePatternLongTimePattern

var customCulture = new CultureInfo("en-US") 
{ 
    DateTimeFormat = 
    { 
     ShortDatePattern = "yyyy-MM-dd", 
     LongTimePattern = "HH:mm:ss.FFFFFFFK" 
    } 
}; 

Console.WriteLine(DateTime.Now); 

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture; 
System.Threading.Thread.CurrentThread.CurrentUICulture = customCulture; 
Console.WriteLine(DateTime.Now); 

Console.ReadLine(); 

しかし、スコットは題した彼のポストがために悪を有効にする:私はC#1にコードを変換し、はい、それは働いている

理由。それをする前に二度考えてください!

Tは必須ではありませんが、提供することもできません。それでも必要な場合は、ReflectionをMatt answeredとして使用する必要があります。

関連する問題