0

DataSet DateTime 列を US/UK 形式から US 形式に変換する以下の方法を最適化するにはどうすればよいですか。最初の日付形式は、米国/英国またはその他の国にすることができます。出力DataSetでそれをUS Date Formatに変換する必要があります

private DataSet ModifyDateToUSFormat(DataSet ds)
    {
        DataSet dsRes = new DataSet();
        DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;

        //Convert from DateTime to String Type
        DataTable dtCloned = ds.Tables[0].Clone();
        foreach (DataColumn dc in ds.Tables[0].Columns)
        {
            if (dc.DataType == typeof(DateTime))
                dtCloned.Columns[dc.ColumnName].DataType = typeof(string);
        }

        foreach (DataRow row in ds.Tables[0].Rows)
            dtCloned.ImportRow(row);

        //Change the String format to US format. Since Database expects US Format Only.
        foreach (DataRow row in dtCloned.Rows)
        {
            foreach (DataColumn dc in ds.Tables[0].Columns)
            {
                if (dc.DataType == typeof(DateTime))
                    row[dc.ColumnName] = DateTime.Parse(row[dc.ColumnName].ToString(), CultureInfo.CurrentCulture, DateTimeStyles.NoCurrentDateDefault).ToString(usDtfi.ShortDatePattern);
            }
        }

        dsRes.Tables.Add(dtCloned);
        return dsRes;
    }
4

1 に答える 1

0

あなたが解決しようとしているまさにその問題をあなたが作り出しているのです。

Aにはカルチャ情報や特定の形式DateTimeは含まれません。SQL Serverなどのデータベースの日付と時刻のデータ型も同様です。datetime

DateTimeからに変換するときstring- それは、カルチャ情報を使用してフォーマットを適用するときです。次に、別のカルチャを使用して文字列を別の形式で解析し、それを に戻そうとしていますがDateTime、ここでもカルチャ情報はありません。

その場合の簡単な答えは、「これをしないでください」です。

明確にするために、SQL Management Studio、Visual Studio Debugger、または使用している環境のいずれかでデータベースからの出力が表示される場合、それはDateTime. それが のstring 表現ですDateTime。どこを見ても、それを見ると現在の文化が適用されます。実際にはその形式でデータベースに存在しません。

たとえば、SQL Server では、datetimeフィールドは 8 バイトとして格納されます。検討:

-- implicitly convert to varchar using the current culture info
select getdate()    -- outputs:  2013-08-19 15:38:41.503

-- explicity convert to varchar using the current culture info
select convert(varchar, getdate())    -- outputs: Aug 19 2013  3:38PM

-- explicity convert to varbinary to show how it's really stored
select convert(varbinary, getdate())  -- outputs:  0x0000A21F0101D1C3
于 2013-08-19T22:32:07.100 に答える