ISO8601形式
日付、時間、時刻、時差などを表現するための国際標準化機構(ISO)による規格で1988年に公開されました。世界中の多くのプログラミング言語やデータベースで採用されています。
1 |
yyyy-MM-ddThh:mm:ssZ |
以下の情報を含みます。
- 日付: 2023-03-24
- 時刻: 15:30:00
- タイムゾーン: +09:00(JST)、ZであればUTC(協定世界時)を指します。
JavaScriptで扱うには
1 |
new Date().toISOString() |
以下のように日時をUTCで返します。
1 |
2023-03-24T05:26:50.069Z |
タイムゾーン
同じ標準時を利用する地域や、区分のことです。
標準時とは?
イギリスのグリニッジ天文台を基準として、その差を示します。
標準時 | 時差 |
---|---|
グリニッジ標準時(GMT) | 0 |
日本標準時(JST) | +9時間 |
台湾標準時 | +8時間 |
中国標準時(香港、マカオを含む) | +8時間 |
UTC、GMT
-両者は、目的も概念も算出方法もまったく異なりますが、日常生活に不都合のない精度の時間測定(整数の秒)であれば、ほぼ差がないと考えて問題ありません。
-ただ、現在の主流はより正確な時刻ということで、「GMT」ではなく、「UTC」になっています。
UTC(Coordinated Universal Time、協定世界時)
-現在はこれ。
-原子時計と精密な天体観測に基づくはるかに精度の高い時間
-「 date.toUTCString()」で取得できる。
GMT(グリニッジ標準時)
-昔は使われていた。
-ロンドンのグリニッジ天文台を経度0度と定め、太陽の南中時刻を午後0時と定めた仮想的な時間
-なお、「date.toGMTString()」は非推奨。
ロケール
-linuxでは「locale」コマンドで現在のロケールを確認できる。
-システムやソフトウェアにおける言語や国・地域の設定のこと
-アルファベット2文字の国コード(ISO 3166)と言語コード(ISO 639)を用いて指定することがある。例えば、日本国は「jp」、日本語は「ja」、イギリスは「gb」、アメリカは「us」、英語は「en」である。
-「ja-jp」のように両者を連ねて記述する方法もあり、「en-us」と「en-gb」
- JavaScriptでは「Date.toLocaleString」で取得できます。
UNIX時間、UNIXタイムスタンプ、エポック秒
-UNIX系OSで標準的に用いられている時間の表現方法
-「1970年1月1日午前0時0分0秒(UTC)」からの経過秒数で表現する
-C言語の「time_t型」による2038年問題がある。
-JavaScriptのDate オブジェクトは 1970 年 1 月 1 日 (UTC) からの経過ミリ秒数を Number型 で保持しています。
例: 2021-07-09T15:00:00.000Z
時間設計
-本番環境との兼ね合いについて。
バックエンド
-基本的にサーバーの時刻
-複数台サーバーを使っている場合は1箇所で取得する構成にした方が良い。
フロントエンド
-ローカルマシンの日付設定やタイムゾーンによって決まる。
-サーバー時間を取得するということもできる。
Railsでのタイムゾーン
ActiveSupport::TimeWithZoneクラス
Railsでタイムゾーンを扱う場合はTimeの代わりにActiveSupport::TimeWithZoneクラスを使います。むしろRailsが日時型をDBから読み込む場合は自動的にこのクラスが使われます。
config/application.rb
下記設定を追加する形であればRailsアプリ全体のタイムゾーン設定を修正できます。なお、設定後はRailsサーバを再起動する必要があります。
1 2 3 4 5 6 7 8 |
module App class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. config.time_zone = 'Tokyo' ★追加 end end |
実際の設計
「Tokyo」などは環境固有の情報なので、RailsのDockerfileなどに固定値として定義しておいて読み込ませるようにすると良いでしょう。
データベースに読み書きするタイムゾーン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
module App class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.1 # Configuration for the application, engines, and railties goes here. # # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # config.time_zone = ENV["TZ"] # config.eager_load_paths << Rails.root.join("extras") # データベースの読み書きに使用するタイムゾーン(:local | :utc(default)) config.active_record.default_timezone = :utc ★追加 # Only loads a smaller set of middleware suitable for API only apps. # Middleware like session, flash, cookies can be added back manually. # Skip views, helpers and assets when generating a new resource. config.api_only = true end end |
デフォルトはutcで世界標準時になります。「:local」と指定すると、「config.time_zone」で指定したタイムゾーンの時間になります。PostgreSQLなどはデフォルトでUTCが使われているので、基本的には「UTC」で保存するようにしましょう。(出ないと読み込みと書き込みにずれが発生して時間にズレが発生します。)
この記事へのコメントはありません。