Преобразовать столбец datetime из utc в местное время в заполненном датированном виде - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь экспортировать некоторые данные из Sql Server в файл Excel, используя EPPLUS, передавая пользовательский sql select statemet.Это работает нормально, но проблема в том, что поля даты и времени хранятся в UTC в БД, вместо этого я хочу показать их в формате локального часового пояса (es.GMT +2).Есть ли способ сделать это с минимальной потерей производительности?Не имеет значения, будет ли столбец преобразован в таблицу данных или в файл Excel с помощью методов EPPLUS.Я хочу, чтобы в итоговом выводе отображалось время в +2 часа.

Я попытался добавить DataColumn col.ExtendedProperties.Add ("TZ", +2);но ничего не изменилось.DataColumn.DateTimeMode не работает с заполненным DataTable.Я пытаюсь заменить столбцы Excel формулой, добавляя +2 часа, но я не мог понять это.Ниже вы можете увидеть мой код.

string connString = @"Data Source=" + DataSourceName + ";Initial Catalog=" + InitialCatalog + ";User ID=" + UserID + "; Password=" + password + ";Integrated Security=SSPI;";
            SqlConnection conn = new SqlConnection(connString);
            conn.Open();
            //retreive data from the report query
            SqlCommand Reportcmd = new SqlCommand(ReportQuery, conn);
            Reportcmd.CommandTimeout = 0;
            SqlDataAdapter Reportda = new SqlDataAdapter(Reportcmd);
            Reportda.Fill(ReportDtTbl);
            conn.Close();
            //var fileName = "Example-CRM-" + DateTime.Now.ToString("yyyy-MM-dd--hh-mm-ss") + ".xlsx";

            MemoryStream stream = new MemoryStream();
            using (ExcelPackage pck = new ExcelPackage(stream))
            {
                ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Report");
                Tempaltesheet.Cells[1, 1, 1, 100].Copy(ws.Cells[1, 1, 1, 100]);  //Cells[RowStart, ColumnStart, RowEnd, ColumnEnd ]
                int colNumber = 1;

                foreach (DataColumn col in ReportDtTbl.Columns)
                {
                    if (col.DataType == typeof(DateTime))
                    {
                        ws.Column(colNumber).Style.Numberformat.Format = "dd/MM/yyyy hh:mm:ss";
                        //DataColumn col.ExtendedProperties.Add("TZ", +2);
                    }
                    colNumber++;
                }
                ws.Cells["A2"].LoadFromDataTable(ReportDtTbl, false);
                // save our new workbook in the output directory and we are done!
                ReportExcel = pck.GetAsByteArray();
                //pck.Save();
            }
            return ReportExcel;

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

, поскольку это уже typeof datetime:

 TimeZoneInfo tz= TimeZoneInfo.FindSystemTimeZoneById("<timezone column?>");//"Central Standard Time"
   DateTime tzTime = TimeZoneInfo.ConvertTimeFromUtc(<utctime>, tzTime );

используйте IsDaylightSavingTime для проверки перехода на летнее время.

Если вы не знаете, что такое местный часовой пояс (он не хранится в хранилище) используйте ToLocalTime для буквального текущего часового пояса.

0 голосов
/ 19 сентября 2019

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

SELECT CONVERT(datetime, 
           SWITCHOFFSET(CONVERT(datetimeoffset, 
                                MyTable.UtcColumn), 
                        DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 
   AS ColumnInLocalTime
FROM MyTable

Как указано в этом ответе, не вычитайтечасы: Преобразовать столбец «Дата-время» из UTC в местное время в операторе выбора

...