将数据集中的日期时间列格式从美国/英国转换为美国
本文关键字:美国 英国 转换 格式 数据集 数据 集中 时间 日期 | 更新日期: 2023-09-27 18:28:19
如何优化以下将数据集日期时间列从美国/英国格式转换为美国格式的方法。初始日期格式可以是美国/英国或任何其他国家/地区。需要在输出数据集中将其转换为美国日期格式
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
。 这就是DateTime
的string
表示。 无论您在哪里寻找,都会在您查看时应用当前区域性。 它实际上并不以这种格式存在于数据库中。
例如,在 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