我有一个数据表,有4列datetime,id,消息和状态。我想使用新的日期时间更新日期时间列(更新的日期时间位于不同的时区,从 CST 到 UTC)。首先,我想这样做就像我将日期时间列存储在列表中并将其存储在列表中并将列表从 cst 转换为 UTC 时区一样。然后将列表添加到同一表中并重新排列列。但这听起来很愚蠢,所以有没有办法用一列数据表的新值更新现有值。
我在其中一个帖子中找到了以下代码,但不确定到底发生了什么。
var rowsToUpdate =
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime);
foreach(var row in rowsToUpdate)
{
row.SetField("datetime", utcDate);
}
数据表中的数据采用 CST 时区,但我希望将该时区转换为 UTC 时区并更新表。
List<DateTime> lstCST = new List<DateTime>();
lstCST = datatable.AsEnumerable().Select(r=>r.Field<DateTime>("CSTDatetime")).ToList();
List<DateTime> lstUTC = new List<DateTime>();
DateTime dt = DateTime.Now;
foreach(var v in lstCST )
{
dt= TimeZoneInfo.ConvertTimeToUtc(v);
lstUTC.Add(dt);
}
谁能指出我如何做到这一点的正确方向。
如果要更新所有行,则不需要 LINQ,但TimeZoneInfo.ConvertTimeToUtc
:
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
foreach (DataRow row in dataTable.Rows)
{
DateTime cstDateTime = row.Field<DateTime>("CSTDatetime");
DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(cstDateTime, cstZone);
row.SetField("CSTDatetime", utcDateTime);
}
看看这个例子:
DataTable table = new DataTable();
table.Columns.AddRange(new DataColumn[]
{
new DataColumn(),
new DataColumn(),
new DataColumn()
});
table.Rows.Add(1, 2, 3);
foreach (DataRow dr in table.Rows)
{
dr[0] = 99;
}
它将更新第一列的所有行并将其设置为 99
要解释代码段的作用:
这是一个过滤器:
var rowsToUpdate =
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime);
它选择"日期时间"列具有特定值的所有行。在您的情况下,我想您可以忽略这一点,您想在所有行上执行此操作。
因此,与其迭代筛选的行,不如迭代所有行。
foreach(var row in rowsToUpdate)
{
row.SetField("datetime", utcDate);
}
后一个代码段将所选内容的每一行中的"日期时间"值设置为 utcDate
的值。在您的情况下,只需通过首先获取"旧"值来替换它,转换它,然后使用上面的行设置转换后的值。
@TimSchmelter已经给出了一个现成的解决方案,所以我不会重复它。我宁愿想解释一下你似乎不清楚的事情。