3

アプリケーションを世界中に展開した経験がある人がいるかどうか、アプリケーションで日付形式をどのように処理したかを知りたいです。

たとえば、私は英国を拠点としており、日付形式は ですDD/MM/YYYYが、日付形式が であるため、米国の顧客に対してアプリケーションがクラッシュしますMM/DD/YYYY

日付はテキストとして構成ファイルに保存され、アプリで呼び出されて使用されます。ただし、英国、ヨーロッパ、オーストラリアの顧客には問題はありませんが、米国とカナダの顧客には問題があります。

私は.Netが日付を処理すると仮定し、使用するDateTime.Parse(strDateFromFile)とクラッシュします。つまり"12/31/2010"、失敗しました"31/12/2010"が、大丈夫でした。

ローカルの日付形式が正しく解析されるようにするために、.Net でできることはありますか。

文字列を既知の形式に変換してから再度変換しようとしましたが、問題があるようです:

     static public string DateToString(DateTime dtDate)
    {
        string strDay = dtDate.Day.ToString();
        string strMonth = String.Format("{0:MMMM}", dtDate).ToString();
        string strYear = dtDate.Year.ToString();
        string strDate = string.Format("{0}-{1}-{2}", strDay, strMonth, strYear);

        return strDate;
    }

    static public DateTime StringToDate(string strDate)
    {
        DateTime dtDate = new DateTime();

        try
        {
            dtDate = DateTime.Parse(strDate);
        }
        catch (Exception ex)
        {
            Logger.Log.Error(MethodBase.GetCurrentMethod().ToString(), ex);
            System.Windows.Forms.MessageBox.Show(string.Format("DEBUG INFO:  Date Format: {0}\r\n{1}", strDate, ex.Message));
        }
    }

申請書全体で日付を使用しているため、申請書で日付をどのように扱うべきかについてのアドバイスはありがたく受け入れられます。

ありがとう

4

4 に答える 4

3

DateTime.Parse を実行するときは、現在のカルチャを渡す必要があります。

DateTime dt = DateTime.Parse("1/1/2000", Thread.CurrentThread.CurrentUICulture);

現在のスレッドのカルチャの設定に関しては、それがユーザーの設定に基づいて自動的に行われるのか、それとも開発中に使用されたカルチャにデフォルト設定されるのかはわかりません。

また、数値と DateTimes (および場合によっては他のもの) の ToString 呼び出しにも同じトリックを使用する必要があることに注意してください。それが大きな問題になる場合は、文化固有の ToStrings の使用に関する警告がある ReSharper の入手を検討してください。

于 2012-07-17T22:41:59.597 に答える
1

ユーザー入力を受け入れる場合、カルチャ情報を設定しようとはしません。ユーザーが何かを入力したときに何を期待するかを知る必要があるだけです。つまり、文化情報が何であるかを知り、それに応じて処理する必要があります。

System.Globalization 名前空間は、これを達成するために必要なもののほとんどを提供します。たとえば、自分のマシンで実行しているときにアプリがこれを行う場合 (私は米国にいます):

DateTimeFormatInfo dtfi = CultureInfo.CurrentCulture.DateTimeFormat;
string dateTimeFormatPattern = dtfi.FullDateTimePattern;

私はこの文字列を取得します:

dddd、MMMM dd、yyyy h:mm:ss tt

または、ShortDatePattern を使用します。

CultureInfo.CurrentCulture.ShortDatePattern = M/d/yyyy

この情報を使用して、ユーザーに何を期待するかを把握し、それに応じて解析できます。

この質問/回答をチェックしてください:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/cb19f31c-6d30-4cd9-8644-80ce3ecde52f/

しかし、@ Eric_Andresの答えは、あなたが探しているものに近いかもしれないと思います...

于 2012-07-17T22:54:16.240 に答える
1

さまざまな国 (カナダ、米国) で使用されている設定ファイルがありましたが、何かを理解するためにシステム (私は AU にいます) に取得されます。(2011 年 1 月 10 日) が 10 月 1 日または 1 月 10 日であることを見ると、事態は非常に奇妙になり始めます。それはそれがどこで発生したかによるので、設定ファイルで人間が読める日付から離れました。代わりにDateTime.Now.ToBinary、どこにロードしても問題なく、常に正しく出力されるように、長い間使用して保存しました。

ロギングのために、私はいつも自分が満足しているフォーマットを選び、それをフォーマットで使用しました.

yyyyMMdd HH:mm:ss.ffffこのようにして、地域設定などに翻弄されることはありません。ロギングは、問題を追跡できるようにするためのものであるため、顧客がそれを読もうとしているかどうかはあまり気にしません.

他のシステムもリモート システムと調整している場合は、現地時間の代わりに UTC を使用して情報を記録することを検討してください。

于 2012-07-17T23:08:23.027 に答える
0

構成やログ、または送信されるファイルが必要な場合は、1 つの日付形式を選択し、そのための手動パーサーを作成します。 Split、それらstringによって数字をSubstring()読むint.Parse()...

于 2012-07-17T23:00:53.947 に答える