日時の管理
4分 6秒
標準時間と日本時間の違い
標準時間(UTC: Coordinated Universal Time)と日本時間(JST: Japan Standard Time)には、9時間の時差があります。
- UTC: 協定世界時。世界中で標準として使用される時刻
- JST: 日本標準時。UTC+9時間
例:
- UTC: 2025-01-27 00:00:00
- JST: 2025-01-27 09:00:00
UTC・JST管理で発生しやすいトラブル例
-
変換ミスによる時刻のズレ
UTCからJSTへの変換処理を漏れたり、二重に変換してしまうことで「9時間ズレて表示される」といったミスが発生しやすいです。 -
日付のまたぎ
UTC だと「前日」だが JST だと「当日」となるケースなど、日付をまたぐタイミングで意図しない表示や判定が起きることがあります。
データベースでの保存
データベースでは、すべての日時をUTCで保存します。これにより、タイムゾーンに依存しない一貫したデータ管理が可能になります。
libsql (Drizzle) での実装例
Drizzleスキーマでは、integer型にtimestamp_msモードを使用して、ミリ秒単位のUnixタイムスタンプとして保存します。
timestampsユーティリティを使用すると、createdAtとupdatedAtが自動的に追加されます:
クライアント側での日付表示
日付の表示はクライアント側(ブラウザ)で行うことを推奨します。これには以下の理由があります:
各ブラウザの時刻に準拠するため
ブラウザはユーザーのシステム設定に基づいてタイムゾーンを自動的に取得します。サーバー側で特定のタイムゾーンに変換する必要がなく、ユーザーの環境に応じた適切な時刻が表示されます。
相対的な表記に対応できるため
クライアント側で日付を処理することで、「3時間前」「2日前」などの相対的な表記を、現在時刻との差分を計算して動的に表示できます。
相対的な日付を表示する参考例
RecencyDate コンポーネント
RecencyDateコンポーネントは、日付の新しさに応じて相対的な表記または絶対的な表記を切り替えます:
使用例
これらの実装により、UTCで保存された日時が、ユーザーのタイムゾーンに応じて適切に表示され、新しいコンテンツは相対的な表記で、古いコンテンツは絶対的な表記で表示されます。