Проблемы даты и времени с функциями Azure и CosmosDb - PullRequest
0 голосов
/ 28 сентября 2018

Раньше я делал «снимок» нашей системы из приложения (клиента) в нашем офисе в Великобритании.Снимок был идентифицирован по метке времени из даты и времени снимка.В CosmosDb отметка времени выглядела следующим образом.

"timeMark": "2018-05-11T15:14:51"

Это было время в Великобритании с использованием DateTime.Now и было фактическим временем в Великобритании, когда был сделан снимок.Я подумал, что было бы неплохо поместить клиент моментальных снимков в приложение-функцию Azure и запускать его автоматически каждые 5 минут.Это работает хорошо, за исключением того, что отметка времени была неверной.Я хотел, чтобы отметка времени на CosmosDb была читаемой как текущее время в Великобритании.Я использовал этот код для изменения метки времени в функции Azure:

public static DateTime UkTime(DateTime t)
{
    TimeZoneInfo ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
    DateTime utcDate = DateTime.Now;
    DateTime ukTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, ukTimeZone);
    return ukTime;
}

Метка времени теперь выглядит так на CosmosDb

"timeMark": "2018-09-28T05:00:04+00:00"

, которая читается как правильное время, которое было принято в Великобритании.(Летнее время).Теперь, когда я читаю таймбэк, это на час вперед от того, что должно быть.

Полностью запутался как лучший способ приблизиться к этому.В основном, Великобритания в настоящее время на GMT + 01 час опережает сентябрьское время по Гринвичу, а в октябре оно вернется на GMT + 00 час.Я хочу иметь возможность прочитать «сырой» документ на CosmosDb как правильное время в Великобритании, когда был сделан снимок, и прочитать его обратно в приложение как таковое.Кажется излишне сложным!

1 Ответ

0 голосов
/ 28 сентября 2018

Я установил функцию для проживания на юге Великобритании.Я установил WEBSITE_TIME_ZONE на портале Azure в стандартное время по Гринвичу и вместо использования DateTime.Now я использовал DateTimeOffSet.

 DateTime uk = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, 0);
 DateTimeOffset uk1 = new DateTimeOffset(uk);

Теперь я получаю правильную метку времени в CosmosDb

 "timeMark": "2018-09-28T10:36:02+01:00"

Когда ячитать из CosmosDb timeMark правильно.

...