Azure Cosmos DB .NET SDK v3 で日付型データを取得するなら UnixDateTimeConverter が便利

※記事の内容に誤りがありましたので修正しました(2019/10/14 12:40)


こんにちは。MLBお兄さんこと松村です。

弊社ではマルチモデルデータベースサービスであるAzure Cosmos DBを使ってアプリケーションを開発することがあります。
多くの場合 .NET Core でのアプリケーションであるため、Azure Cosmos DB .NET SDK v3を使用してデータ操作を行います。

www.nuget.org

Azure Cosmos DBにJSONアイテムを作成するとタイムスタンプである _ts というプロパティが自動的に付加されます。
このプロパティにはJSONアイテムが作成された時点のUnixタイムスタンプが設定されます。

{
    "id": "replace_with_new_document_id",
    "_rid": "JtcgANFkX60+AAAAAAAAAA==",
    "_self": "dbs/JtcgAA==/colls/JtcgANFkX60=/docs/JtcgANFkX60+AAAAAAAAAA==/",
    "_etag": "\"00000000-0000-0000-7dd3-48be82e501d5\"",
    "_attachments": "attachments/",
    "_ts": 1570537448
}

アプリケーションからJSONアイテムを取得する際、このタイムスタンプを使用したいことがあります。(登録日時のように)
しかし大抵、Unixタイムスタンプの値をそのまま表示するのではなく、日付型に変換したうえで年月日形式で表示したくなります。
通常はC#のDateTime型の機能で日付変換を行いますが、Azure Cosmos DB .NET SDKにはUnixDateTimeConverterという便利なコンバーターがあります。

(追記)こういった場合、Newtonsoft.Jsonに含まれている[UnixDateTimeConverter]というコンバーターを利用することになります。

www.newtonsoft.com

使い方としては、クエリを用いてJSONアイテムを取得するときに使用するクラスに定義したタイムスタンプ用のプロパティに属性として設定することで、DateTime型として取得することができます。
サンプルコードです。

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

class Ducument
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("_ts")]
    [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))] // この部分
    public DateTime Timestamp { get; set; }

    /*
    [JsonProperty("_ts")]
    public int Timestamp { get; set; } // 本来はint型で取得する
    */
}

自力で日付変換する必要がないので便利ですね。
Azure Cosmos DBで日付を扱う際に参考となるドキュメントを載せておきます。

docs.microsoft.com