我有一个数据表,其中包含4列datetime,id,message&状态。我想用新的日期时间更新datetime列(更新的日期时间在不同的时区,从CST到UTC)。首先,我想要这样做,就像我将采用datetime列并将其存储在列表中并将列表从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);
}
任何人都可以指出我如何做到这一点的正确方向。
答案 0 :(得分:3)
如果要更新所有行,则不需要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);
}
答案 1 :(得分:1)
解释代码片段的作用:
这是一个过滤器:
var rowsToUpdate =
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime);
它选择“datetime”列具有特定值的所有行。在您的情况下,我猜您可以忽略这一点,您希望在所有行上执行此操作。
因此,不是迭代过滤的行,而是迭代所有行。
foreach(var row in rowsToUpdate)
{
row.SetField("datetime", utcDate);
}
后一个片段将所选内容的每一行中的“datetime”值设置为utcDate
的值。在您的情况下,只需首先获取“旧”值,转换它然后使用上面的行来设置转换后的值来替换它。
@TimSchmelter已经给了ready-to-go solution所以我不会重复它。我宁愿想解释一下看似不清楚的事情。
答案 2 :(得分:0)
看看这个例子:
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