2017-02-01 9 views
2

У меня есть таблица данных с 4 столбцами datetime, id, message & status. Я хочу обновить столбец datetime новым datetime (обновленное время datetime находится в разных часовых поясах, от CST до UTC). Сначала я думал сделать это, как будто я взял столбец datetime и сохранил его в списке и преобразовал список в часовую зону utc из cst.Then добавить список в ту же таблицу и изменить порядок столбцов. Но это звучит глупо, поэтому можно каким-либо образом обновить существующее значение новыми значениями для одного столбца datatable.Как обновить первый столбец данных для всех строк, используя LINQQ или любой другой метод?

Я нашел приведенный ниже код на одном из сообщений, но не уверен, что именно происходит.

var rowsToUpdate = 
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime); 

foreach(var row in rowsToUpdate) 
{ 
    row.SetField("datetime", utcDate); 
} 

данные в DataTable в ДКБ часовом поясе, но я хочу, что часовой пояс должен быть преобразован в 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); 
} 

Может кто-нибудь указать мне в правильном направлении, как это сделать.

ответ

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); 
} 
+0

Большое спасибо! Это работало как шарм. Я понятия не имел, что это может быть так легко. Спасибо много. –

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

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, поэтому я не буду повторять его. Я скорее хотел объяснить, что вам кажется непонятным.

+0

спасибо !! Это поможет мне понять поток и помочь мне лучше понять решение. Очень признателен. –

+0

@TushitNagda «Очень ценится» - На этом мы проявляем признательность Upvoting; D – Fildor

+0

Я знаю: D Как только у меня будет 15 повторений, я обязательно отвечу на ваш ответ. Я закладовал этот вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^