Продолжим про десериализацию во входящих запросах
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