3

文字列「30/12/2012」を「2012/12/30」に変換したい。私のアプリケーションは「en-CA」に設定されていますが、データベースはデフォルトとして yyyy/MM/dd を受け入れます。

サーバーに設定されている現在のカルチャ情報に依存せずにこれを行うにはどうすればよいですか?

4

6 に答える 6

13

すべてのコメントが言っているように、これまでのところ回答はありません。これをデータベースに文字列として渡さないでください

受信したテキストをできるだけ早く解析し、パラメーター化された SQL 1を介してデータベースに送信する方法を含め、他の場所DateTimeでそれを表現するために使用します。これはすべての種類の値に当てはまります。できるだけ早くデータの「自然な」型に変換し、その自然な表現をできるだけ長く維持してください日付は文字列ではありません。文字列に変換する必要がある場合にのみ、文字列に変換する必要があります。理想的には、ユーザーに表示する直前です。

解析は、これが「疑わしい」データ (ユーザーからのデータなど) であるか、実際には正しいはずであり、例外が解析不能な値に対する最も適切な反応であるデータであるDateTime.ParseExactかに応じて実行できます。カスタム形式の文字列を渡すことをお勧めします。例えば:DateTime.TryParseExactCultureInfo.InvariantCulture

DateTime date = DateTime.ParseExact(text, "dd/MM/yyyy",
                                    CultureInfo.InvariantCulture);

(日付/時刻の作業が多い場合は、より豊かな方法で値を表現できる私のNoda Time プロジェクトの使用を検討することもできます。この場合は、おそらく を使用しますLocalDate。)


1パラメータ化された SQL をまだ使用しておらず、代わりに値を直接 SQL に焼き付けている場合は、日付/時刻の変換よりも大きな問題があります。

于 2012-06-20T05:51:03.640 に答える
4

FormatおよびほとんどのToString関数でCultureInfoを指定できます。

つまり、DateTime.ToString( CultureInfo およびDateTime.Parse(string、CultureInfo)を使用すると、あるカルチャ(つまり、currentまたはnew CultureInfo("en-CA"))で文字列を解析し、。のような別のカルチャでフォーマットできますnew CultureInfo("en-us")

en-US注: Thread.CurrentCultureを設定することにより、他のカルチャ(つまり)ですべてのDBアクセスを実行することを検討できます。これは、数値の形式も影響を受ける場合があるためです(数値が文字列として格納されている場合)。

于 2012-06-20T05:29:13.537 に答える
3

常に同じ形式になる場合。/次に、それをキャラクターに分割します

string[] tempsplit = datestring.Split('/');

そして、それを元に戻します

string joinstring = "/";
string newdate = tempsplit[2] + joinstring + tempsplit[1] + joinstring + tempsplit[0];

単純。

于 2012-06-20T05:32:54.293 に答える
2

最初に文字列を DateTime 形式に変換します

DateTime dt = Convert.ToDateTime("your string value");

次に、次を使用して文字列に保存します。

string st=dt.ToString("yyyy/MM/dd");

これにより、カルチャに依存せずに、日付形式が必要な任意の形式に変換されます

于 2012-06-20T05:45:19.043 に答える
1

これはうまくいくようです。

        var x = new string[] { "2012/06/12", "20/06/2012", "111/111/1111" };
        foreach (var ds in x)
        {
            DateTime d = default(DateTime);
            try
            {
                d = DateTime.Parse(ds, CultureInfo.GetCultureInfo("en-CA"));
            }
            catch (Exception ex)
            {
                try
                {
                    d = DateTime.ParseExact(ds, "yyyy/MM/dd", CultureInfo.InvariantCulture);
                }
                catch
                {
                }
            }
            if (d == default(DateTime))
                Console.WriteLine("error");
            else
                Console.WriteLine(d.ToString());
        }
于 2012-06-20T05:34:38.513 に答える
1

データベースが受け入れるかどうかの問題に立ち入らずに、次のような変換を行うことができます。

于 2012-06-20T05:35:36.553 に答える