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