0

如何优化以下将 DataSet DateTime Column 从 US/UK 格式转换为 US 格式的方法。初始日期格式可以是美国/英国或任何其他国家/地区。需要在输出数据集中将其转换为美国日期格式

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

你正在创造你试图解决的问题。

ADateTime不携带任何文化信息或特定格式。数据库中的日期和时间数据类型也没有,例如datetimeSQL Server。

当您将其转换为时DateTime-string那就是您使用文化信息来应用格式的时候。然后,您尝试使用不同的文化来解析不同格式的字符串并将其解析回 a DateTime,它又没有文化信息。

那么简单的答案是 -不要这样做

说得非常清楚 - 当您在 SQL Management Studio、Visual Studio 调试器或您使用的任何环境中看到数据库的输出时 - 这不是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 回答