📌

UnixタイムスタンプとISO8061型式文字列の使い分け

2023/04/25に公開

JavaScript/TypeScript上でオブジェクトの配列を更新日時のようなプロパティでソートしたいこと、ありますね。

const sorted = objects.sort((a, b) => {
  if (a.updated_at < b.updated_at) {
    return -1
  }
  if (a.updated_at > b.updated_at) {
    return 1
  }
  return 0
} 

そのとき、日時を表現するプロパティの型として、Unixタイムスタンプを意味する整数にするか、ISO8061型式の文字列にするか、という選択肢があるかな、と思います。(JSONに変換しやすくするため、Dateクラスのオブジェクトは考慮から外します。)

人間の目に優しいのはISO8061型式の文字列です。複数のUnixタイムスタンプを見せられて、その大小を瞬時に識別できる人は、あまりいないでしょう。では、いつでもISO8061型式の文字列を使えば良いかというとそうは言えません。そのオブジェクトの日時プロパティから、日付計算をして、別の日時を導き出すような計算を多用する場合、ISO8061型式の文字列をparseしてDateクラスのオブジェクトに変換する等の処理が必要になります。これは、計算時間的には、けっして軽くはないです。

私はデータストアとしてMongoDB、DynamoDB、Redisなどを使うことが多いです。

  1. MongoDBを使っているときはISO8061型式の文字列を使います。MongoDBの扱うデータ(ドキュメント)はJSON型式であり、JSON型式ではISO8061型式の文字列で日時を表現するからです。また、MongoDBを使うときはmongo-expressを使ってWeb上で管理画面のようにドキュメントを検索/閲覧/編集することがあり、そのとき、人にやさしい型式であるメリットは大きいです。
  2. DynamoDBを使っているときはUnixタイムスタンプを使います。DynamoDBではデータ(アイテム)における制約が厳しく、個々のアイテムのサイズは小さい方が良いです。ISO8061型式より、Unixタイムスタンプの方が小さくなります。たしかにAWSのマネジメントコンソール上でDynamoDBのアイテムを検索/閲覧/編集することはあり、そのとき人にやさしい型式であることは大事なのですが、MongoDBではなくDynamoDBを採用している場合には性能に関心がある場合が多いと思います。ここでは性能も重視してDynamoDBにしておきます。
  3. Redisを使っているときはUnixタイムスタンプを使います。RedisはCLIから対話的に利用することも可能ですが、通常、Redisを使っているときは性能を極限まで追求したいはずです。ここでは人間に優しくなくても、Unixタイムスタンプを使っておきましょう。

Discussion