6

次の C# コードがあるとします。

var dt = DateTime.Now;
Console.WriteLine("{0:MM/dd/yy} ... {1}", dt, string.Format("{0:MM/dd/yy}", dt));

...短い日付(Windows 7の下でControl Panel -> Region and Language -> Additonal Settings -> Date)が「、」の米国標準に設定されている場合、次のM/d/yyyyようになります:

06/17/14 ... 06/17/14

ただし、短い日付を「 」に変更すると、次のddd dd MMM yyyyようになります。

06/17/14 ... 06 17 14

Console.WriteLine私は、常にフォーマットされた値を同じようにstring.Format文字列化するという印象を受けました。DateTimeこの不一致の説明は何ですか?

編集:これは、最初に問題が発生した標準の単体テスト出力(Visual Studio)でのみ発生するようです。コンソール アプリでコードを実行すると、出力は06 17 14 ... 06 17 14.

4

2 に答える 2

3

この状況は、MSTest がコンソール出力をテスト ウィンドウにリダイレクトするときに、コンソールに関連付けられたに渡さCultureInfo.InvariantCultureれるために発生します。TextWriter

これは、次の方法で確認できます。

var threadCulture = Thread.CurrentThread.CurrentCulture;
var consoleCulture = Console.Out.FormatProvider;

Console.WriteLine(threadCulture.Equals(CultureInfo.InvariantCulture));
Console.WriteLine(consoleCulture.Equals(CultureInfo.InvariantCulture));

変更しない限り、スレッドの現在のカルチャは通常、 のようなものen-USか、コンピューターの設定に関係なくです。したがって、最初の項目は通常 false になります。

ただし、2 番目の項目は、実行元によって異なります。コンソール アプリケーションとして、コンソール出力カルチャはデフォルトで現在のスレッド カルチャに設定する必要があるため、false になります。XUnit または NUnit テストでも、結果は false です。しかし、MSTest では、結果は true です。

.NET Framework Reference Sourceを掘り下げると、次のことがわかります。

MSTest テスト ランナーのソースが公開されているとは思いませんが、次のようなことをどこかで行う必要があると結論付けることができます。

Console.Out = new SomeWriter(CultureInfo.InvariantCulture);

どこSomeWriterでテスト出力を作成し、から継承しTextWriterます。

一方、String.Format別のカルチャを特に指定しない限り、常にスレッドの現在のカルチャが使用されます。

これを回避する 1 つの方法は、スレッドの現在のカルチャをインバリアント カルチャに明示的に設定することです。

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
于 2014-06-18T22:43:56.240 に答える
1

これは、メソッドがシンボルFormatを解釈する方法によるものです。/

MSDNから

カスタム書式指定文字列に "/" 書式指定子が含まれている場合、DateTime.ToString メソッドは結果文字列の "/" の代わりに DateSeparator の値を表示します。

DateSeparator プロパティは、書式設定操作の結果文字列で日付区切り文字 ("/" カスタム日付と時刻の書式指定子) を置き換える文字列を定義します。また、解析操作で日付区切り文字列も定義します。

フォーマットを変更すると、デフォルトの記号が空白文字に変更されます。

文字を表示する必要がある場合/は、 を使用してエスケープできます\。したがって、フォーマット文字列を に変更すると、{0:MM\/dd\/yy}常に が表示されます/

于 2014-06-18T12:37:42.457 に答える