将数据集中的日期时间列格式从美国/英国转换为美国



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

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;
    }

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

DateTime不携带任何区域性信息或特定格式。 数据库中的日期和时间数据类型(如 SQL Server 中的datetime(也是如此。

当您将其从DateTime转换为string时 - 这是您使用区域性信息应用格式的时候。 然后,您尝试使用不同的区域性以不同的格式解析字符串并将其解析回DateTime,其中它再次没有区域性信息。

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

为了非常清楚 - 当您在SQL Management Studio,Visual Studio Debugger或正在使用的任何环境中看到数据库的输出时 - 这不是一个DateTime。 这就是DateTimestring表示。 无论您在哪里寻找,都会在您查看时应用当前区域性。 它实际上并不以这种格式存在于数据库中。

例如,在 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

最新更新