Функция Azure изменяет формат сообщения DateTime ISO 8601 UTC на локальный формат DateTime. - PullRequest
0 голосов
/ 09 апреля 2019

Проблема

Формат DateTime изменяется с 2019-04-09T11: 43: 11Z на 2019-04-09T11: 43: 11 + 00: 0 моего сообщения очереди.

Подробности

Рассмотрим две функции лазури F1 и F2 . F1 помещает сообщение в f2-queue.

Рассмотрим следующие классы для понимания подготовки сообщения:

public class MyRequest
{
    public int Id {get; set;}
    public object Obj {get; set;}
}

public Class MyMessage
{
    public DateTime UpdatedDate {get; set;}
}

Я использую ADO.NET для чтения из базы данных.

myMessage.UpdatedDate = DateTime.SpecifyKind(Convert.ToDateTime(reader["Updated_Date"]), DateTimeKind.Utc);

myRequest.Obj = myMessage;

Я сериализуюmyRequest с использованием JsonConvert.SerializeObject.Дата сериализованного объекта имеет время 2019-04-09T11: 43: 11Z .Я ставлю в очередь myRequest в f2-queue.

F2 - это очередь, запускаемая функция лазури .

[FunctionName("F2")]
        public static async Task Run([QueueTrigger("f2-queue", Connection = "")]MyRequest myRequest, ILogger log)

Здесь в myRequest формат DateTime UpdatedDate меняется на 2019-04-09T11: 43: 11 + 00: 00 .

Вещи, которые я пытался

  • Поместил свойство DateTime в MyRequest и сохранил в нем DateTime.UtcNow.Формат DateTime в этом случае не изменяется.
  • Похоже, что +00: 00 изменяется в соответствии с часовым поясом, установленным на машине, на которой выполняется код.
  • Первоначально использовался DateTime.TryParse(reader["Updated_Date"].ToString(), out DateTime lastUpdatedDate)и заметил, что DateTime.Kind было Не указано .Изменился на вышеупомянутый подход.DateTime.Kind теперь равен Utc , но формат DateTime все еще меняется.
  • Вместо назначения значения из базы данных назначается DateTime.UtcNow.Формат все еще меняется.Похоже, что нет никаких проблем с присвоением значения.
  • Заглянул в очередь, используя Storage Explorer .Само сообщение имеет прекрасный формат DateTime.

1 Ответ

0 голосов
/ 16 апреля 2019

Это происходит из-за того, как Newtonsoft сериализует DateTimes, когда для Kind установлено значение Utc vs. Local. Чтобы изменить этот сервер, вы можете использовать параметр DateFormatString для переопределения значений по умолчанию.

Я протестировал его с помощью консольного приложения, но поведение должно быть таким же в функции. WebJob, лежащий в основе проекта Functions, основан на консольном приложении.

namespace ConsoleApp8
{   
    class Program
    {
        static void Main(string[] args)
        {
            var serializerSettings = new JsonSerializerSettings()
            {
                DateFormatString = "yyyy-MM-ddThh:mm:ssZ"
            };

            Console.WriteLine($"DateTime.Now: {JsonConvert.SerializeObject(DateTime.Now)}, DateTime.Now Kind: {DateTime.Now.Kind}");
            Console.WriteLine($"DateTime.UtcNow: {JsonConvert.SerializeObject(DateTime.UtcNow)}, DateTime.UtcNow Kind: {DateTime.UtcNow.Kind}");
            Console.WriteLine($"DateTime.Now with formatting: {JsonConvert.SerializeObject(DateTime.Now, serializerSettings)}, DateTime.Now Kind: {DateTime.Now.Kind}");

            Console.ReadLine();
        }
    }
}

Код выводит следующее:

DateTime.Now: "2019-04-16T10: 53: 54.6557713-04: 00", DateTime.Now Вид: локальный

DateTime.UtcNow: "2019-04-16T14: 53: 54.9357612Z", DateTime.UtcNow Вид: Utc

DateTime.Now с форматированием: «2019-04-16T10: 53: 54Z», DateTime.Now. Вид: локальный

...