Продолжим про десериализацию во входящих запросах ASP.NET - в частности, про приём дат в json-теле запроса.

Первая часть (https://teleg.eu/s/boyarincevdotnet/41) где мы посмотрели как десериализуется DateTime.

Сегодня посмотрим как десериализатор отработает по нашему тестовому набору дат:

"2024-02-08T00:00:00+00:00"
"2024-02-08T00:00:00+01:00"
"2024-02-08T00:00:00:10Z"
"2024-02-08"


Если целевой тип будет DateTimeOffse:

using System.Text.Json;
using System.Runtime.InteropServices;

var jsonWithOffset0 = "{ \"Date\":\"2024-02-08T00:00:00+00:00\"}";
var jsonWithOffset3 = "{ \"Date\":\"2024-02-08T00:00:00+03:00\"}";
var jsonZ = "{ \"Date\":\"2024-02-08T00:00:00Z\"}";
var jsonDateTime = "{ \"Date\":\"2024-02-08T00:00:00\"}";
var jsonOnlyDate = "{ \"Date\":\"2024-02-08\"}";

Console.WriteLine($"{RuntimeInformation.OSDescription}");

Console.WriteLine($"Local TimeZone: {TimeZoneInfo.Local}");

var resultJsonWithOffset0 = JsonSerializer.Deserialize<DateTimeOffsetModel>(jsonWithOffset0);
Console.WriteLine(GetDateTimeOffsetString(resultJsonWithOffset0.Date, jsonWithOffset0));

var resultJsonWithOffset3 = JsonSerializer.Deserialize<DateTimeOffsetModel>(jsonWithOffset3);
Console.WriteLine(GetDateTimeOffsetString(resultJsonWithOffset3.Date, jsonWithOffset3));

var resultJsonZ = JsonSerializer.Deserialize<DateTimeOffsetModel>(jsonZ);
Console.WriteLine(GetDateTimeOffsetString(resultJsonZ.Date, jsonZ));

var resultJsonDateTime = JsonSerializer.Deserialize<DateTimeOffsetModel>(jsonDateTime);
Console.WriteLine(GetDateTimeOffsetString(resultJsonDateTime.Date, jsonDateTime));

var resultJsonOnlyDate = JsonSerializer.Deserialize<DateTimeOffsetModel>(jsonOnlyDate);
Console.WriteLine(GetDateTimeOffsetString(resultJsonOnlyDate.Date, jsonOnlyDate));

string GetDateTimeOffsetString(DateTimeOffset dateTime, string json) =>
$"{dateTime} {dateTime.DateTime.Kind} ({json})";

class DateTimeOffsetModel
{
public DateTimeOffset Date { get; set; }
}


Результат:

Microsoft Windows 10.0.22621
Local TimeZone: (UTC) Время в формате UTC
08.02.2024 0:00:00 +00:00 Unspecified ({ "Date":"2024-02-08T00:00:00+00:00"})
08.02.2024 0:00:00 +01:00 Unspecified ({ "Date":"2024-02-08T00:00:00+01:00"})
08.02.2024 0:00:00 +00:00 Unspecified ({ "Date":"2024-02-08T00:00:00Z"})
08.02.2024 0:00:00 +00:00 Unspecified ({ "Date":"2024-02-08T00:00:00"})
08.02.2024 0:00:00 +00:00 Unspecified ({ "Date":"2024-02-08"})


Тут без сюрпризов - как мне кажется, мы получаем всё ровно так как и ожидаем.

Реализация в коде System.Text.Json
How to Save Live Photo as Video