如何使用 System.Text.Json 序列化 DateTimeOffset 為 Unix 時間戳

Newbe36524發表於2022-12-14

在 .NET 中,日期和時間通常使用 DateTime 或 DateTimeOffset 來表示。這兩種資料型別都可以表示日期和時間,但它們之間有一些明顯的區別。DateTime 是不帶時區資訊的,而 DateTimeOffset 是帶時區偏移量的,可以用來表示一個特定的時刻。

在現代 web 應用中,我們經常需要將日期和時間資料序列化為 JSON 格式,以便在客戶端和服務端之間進行通訊。.NET 提供了多種方法來實現 JSON 序列化,其中 System.Text.Json 庫是 .NET Core 3.0 以後推出的新型 JSON 序列化器,它比早期的 DataContractJsonSerializer 和 Newtonsoft.Json 更快,更輕量,並且提供了更為豐富的功能。

在本文中,我們將探討如何在 System.Text.Json 中將 DateTimeOffset 序列化為時間戳。

程式碼示例

下面是一個簡單的 .NET Core 控制檯應用,它演示瞭如何使用 System.Text.Json 庫將 DateTimeOffset 序列化為時間戳。

using System;
using System.Text.Json;

namespace JsonSerialization
{
class Program
{
static void Main(string[] args)
{
// 建立一個 DateTimeOffset 物件
var dateTimeOffset = new DateTimeOffset(2020, 10, 25, 10, 15, 0, TimeSpan.FromHours(8));

// 序列化 DateTimeOffset 物件為 JSON
var json = JsonSerializer.Serialize(dateTimeOffset, new JsonSerializerOptions
{
// 設定時間戳格式
Converters = { new DateTimeOffsetConverter() }
});

// 輸出結果
Console.WriteLine(json);

// 等待使用者輸入
Console.ReadKey();
}
}

// 定義 DateTimeOffset 轉換器
public class DateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64());
}

public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
{
writer.WriteNumberValue(value.ToUnixTimeMilliseconds());
}
}
}

執行結果如下:

1603592100000

可以看到,DateTimeOffset 物件已經被序列化為時間戳形式的 JSON 資料。

使用建議

在實際應用中,建議將 DateTimeOffsetConverter 類定義為一個單獨的檔案,例如 DateTimeOffsetConverter.cs,這樣就可以輕鬆地在多個專案中複用該轉換器。

另外,在實際專案中,可能需要對時間戳的格式進行進一步的自定義。

總結

本文介紹瞭如何使用 System.Text.Json 庫將 DateTimeOffset 序列化為時間戳。實際應用中,序列化為時間戳可以使客戶端更容易處理日期和時間資料,而且能夠提高資料傳輸的效率。

參考資料

本文采用 Chat OpenAI 輔助注水澆築而成,如有雷同,完全有可能。

相關文章