5

更新これは Windows 7 のバグのようです。Windows 8 で同じシナリオをテストしましたが、そこで再現することはできません。詳細については、この問題について投稿したMS Bug Reportを参照してください。助けてくれたすべての人にもう一度感謝します。

UPDATE 2 Server 2008 R2でもエラーが発生します(予想通り)

元の提出

次のページの日付形式の例を使用して、日付の形式を制御できます。ただし、Windows 7 を使用しているクライアントの 1 人は、カレンダーを変更して、「ddd MM/dd/yy」のような短い日付を表示しました。設定の画像を参照してください。短い日付形式.

このように時計が表示されますここに画像の説明を入力

彼らのマシンで日付を使用する場合を除いて、これは正常に機能します。次のように日付をフォーマットすると...

String.Format("{0:MM/dd/yy}", dt); //the result is 06 04 13, notice the spaces

カレンダー設定で曜日を表示するために ddd を取り外し、同じ形式オプションを使用すると、次のように表示されます...

String.Format("{0:MM/dd/yy}", dt); //the result is 06/04/13, this time it has forward slashes

日付の .ToShortDateString() オプションを指定すると、「Tue 06/04/13」と表示され、データベースにアクセスするとクラッシュします。これが問題の発見方法です。

形式をハードコーディングする以外に、つまり、月をスラッシュから日に結合するなど、これを機能させるために他に何ができるか知っている人はいますか?

4

4 に答える 4

3

SQL経由で送信するために、日付を文字列としてフォーマットしているようです。文字列の書式設定の代わりに、これにコマンド パラメーターを使用することを検討しましたか?

于 2013-06-04T18:37:09.720 に答える
2

注:これは Windows 7 のバグのようです。OP の投稿のように「追加設定」タブを使用して、コントロール パネルから短い日付パターンを変更すると、CurrentCulture と CurrentUICulture の両方の日付区切り文字も変更されます。

短い日付形式を変更すると、最初の非形式文字が現在のカルチャの日付区切り文字として選択されたように見えます。CurrentCulture と CUrrentUiCulture の両方が変更され、その [意図しない] カスタマイズが反映されます。一部の[優秀な]開発者は、曜日のようなものを含む短い日付形式を誰も持っていないという[不当な]仮定を立てたようです.

ナイスキャッチ!マイクロソフトにバグを報告しますか?

インバリアント カルチャを使用して日付などをフォーマットする場合、ユーザー設定は影響しません。次のようなものを試してください

String.Format( CultureInfo.InvariantCulture , "{0:MM/dd/yy}", dt);

または、必要なカルチャのインスタンスを使用します。

CultureInfo usa = CultureInfo.GetCultureINfo("en-US") ;
string.Format( usa , "{0:MM/dd/yy}" , dt ) ;

ただし、指定したカルチャが Windows OS の現在のカルチャ セットと一致する場合、ユーザーのカスタマイズが適用されます。つまり、現在の Windows カルチャではないカルチャを使用しない限り、同じ問題が発生します。

詳細については、MDSN を参照してください。

特定のカルチャを指定しないと、現在のユーザーのCurrentCulture、またはCurrentUICultureユーザー指定の mod が適用された状態で取得されます。

于 2013-06-04T17:38:47.207 に答える
2

InvariantCulture を使用するとうまくいくはずです。それを確認するためのテスト コンソール アプリを作成しました。このコードは、スレッドの現在のカルチャをインバリアント カルチャに変更します。

class Program
{
    static void Main(string[] args)
    {
            /// Displays '06 04 13'

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

        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

            /// Displays '06/04/13'

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

        Console.ReadLine();
    }
}
于 2013-06-04T18:00:25.227 に答える
1

詳細については、MS フォーラムの投稿 (ここに掲載) を参照してください

于 2013-06-04T19:15:16.763 に答える