Форматировать время в DataGridView по местному часовому поясу - PullRequest
3 голосов
/ 26 августа 2011

У меня есть процесс, который выполняется на сервере SQL, который настроен на восточное время, когда процесс, который он завершил, заполняет таблицу временем завершения. У меня есть представление, которое в настоящее время используется несколькими приложениями, которое отображает дату / время процесса в разных столбцах, поскольку оно используется другими приложениями, и я не могу изменить представление.

Запрос, который я использую для возврата данных процесса, приведен ниже, а Дата / Время конвертируются в varchar на стороне сервера - поэтому он не поступает в пользовательский интерфейс как дата / время.

 SELECT CONVERT(VARCHAR(10), A2.TaskDateTime, 101) AS TaskDate,
        CONVERT(VARCHAR(5),  A2.TaskDateTime, 108) AS TaskTime
 FROM Task  AS T2
 JOIN Application_Task AS A2    
  ON A2.TaskID = T2.TaskID

Эти данные затем отображаются в пользовательском интерфейсе через сетку данных. Я пытаюсь отформатировать временной столбец в DataGridView для своего местного часового пояса, поскольку пользователи будут находиться в разных часовых поясах.

Я посмотрел на DataGridViewCellStyle.Format , выполнил поиск SO и обнаружил это при преобразовании в местное время , но это парсинг одной строки. Я не могу понять, как применить это ко всему столбцу данных.

Буду признателен за любую помощь и / или указания о том, с чего начать.

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Я обрабатываю это в событии CellFormatting:

    private void OnCellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
        DataGridView dgView = (DataGridView)(sender);
        // no need to add TaskTime...
        if (e.ColumnIndex != dgView.Columns["TaskDate"].Index) return;
        string cellValue = e.Value + " " + dgView.CurrentRow.Cells[dgView.Columns["TaskTime"].Value);
        DateTime dtValue;
        DateTime.TryParse(cellValue, out dtValue);
        DateTime dtValueUTC = TimezoneInfo.ConvertTimeToUtc(dtValue, "Eastern Time Zone");
        e.Value = dtValueUTC.Value.ToLocalTime();
    }
0 голосов
/ 05 марта 2013

Убедитесь, что все ваши данные в базе данных указаны в формате UTC.Это в значительной степени стандартный способ хранения даты / времени в базах данных.Я научился этому нелегко.

Добавьте этот код в событие CellFormatting

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (e.Value is DateTime)
        {
            DateTime value = (DateTime)e.Value;
            switch (value.Kind)
            {
                case DateTimeKind.Local:
                    break;
                case DateTimeKind.Unspecified:
                    e.Value = DateTime.SpecifyKind(value, DateTimeKind.Utc).ToLocalTime();
                    break;
                case DateTimeKind.Utc:
                    e.Value = value.ToLocalTime();
                    break;
            }
        }
    }

Редактировать: я только что заметил, что вы переходите из EST в Local и заметил, что вы не можете изменитьбаза данных.Я оставляю верхнюю функцию без изменений, поскольку это популярный результат поиска.

Так что добавьте эти строки в начало функции выше

if (e.ColumnIndex == 0) //change this to your column
{
    String sqlFormat = "MM/dd/yyyy"; //change this to the sql format
    DateTime parsedDateTime = DateTime.ParseExact(e.Value, sqlFormat, null);
    TimeZoneInfo tziEastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    e.Value = TimeZoneInfo.ConvertTimeToUtc(parseDateTime, tziEastern);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...