Azure webjob конвертировать время в универсальное время - PullRequest
1 голос
/ 16 марта 2020

У меня есть веб-работа в azure, включающая получение строкового значения и преобразование его в значение DateTime. Проблема заключается в том, что я хочу, чтобы функция предположила, что это время изначально введено в центральное время (CST), а затем преобразовала его в универсальное время. Когда я запускаю эту функцию локально, все работает как положено. Я полагаю, что проблема заключается в том, что когда функция запускается с сервера azure, она предполагает, что все времена находятся в UT C для начала (поэтому попытка преобразовать ее в UT C вообще не меняет ее).

Вот мой код:

function(string date) 
{
    return DateTime.SpecifyKind(Clean<DateTime>(date.ToString()). DateTimeKind.Local).ToUniversalTime();
}

//The clean function converts the string to the correct date format
private static T Clean<T>(string s) {
    s = Clean(s);
    var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
    return (s == "") ? default(T) : (T)Convert.ChangeType(s, type);
}

В основном мои логики c: конвертировать строку в формат DateTime (с функцией Clean), затем использовать SpeficyKind для обработки ее как локальной даты, затем преобразовать его в универсальное время.

Ожидаемый результат: если строка даты «28.12.2009», я бы хотел, чтобы выходные данные были 2019-12-28T06: 00: 00Z. Это работает, когда я проверяю функцию локально. Однако в моем веб-задании результат всегда 2019-12-28T00: 00: 00Z

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Не используйте понятие «местное время» вообще. Вместо этого используйте указанный c идентификатор часового пояса и функции TimeZoneInfo, такие как ConvertTimeToUtc

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dateTime, tz);

Для timeZoneId:

  • Если вы развертываете функции на Windows, используйте "Central Standard Time", который охватывает как CST, так и CDT в США и Канаде.

  • Если вы развертываете Для функций на Linux, используйте "America/Chicago".

  • Если вы хотите написать кроссплатформенный код, используйте мою библиотеку TimeZoneConverter, чтобы получить часовой пояс с любым идентификатором.

0 голосов
/ 16 марта 2020

Azure сервисы приложений используют часовой пояс UT C по умолчанию / местный часовой пояс. Попробуйте установить часовой пояс вашего приложения в CST: http://www.louischarlesgagnon.com/post/azure-app-service-set-timezone-for-your-web-application

ОБНОВЛЕНИЕ

В качестве альтернативы, вы можете использовать DateTimeOffset вместо DateTime:

var timezone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");

var ctsDate = DateTime.Parse(date, System.Globalization.CultureInfo.InvariantCulture);
var offset = timezone.GetUtcOffset(ctsDate);

var utcDate = new DateTimeOffset(ctsDate, offset).ToUniversalTime().DateTime;
...