プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • プログラミング全般
  • 【プログラミング】「日時」に関する知識
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【プログラミング】「日時」に関する知識

10.10

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

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」で保存するようにしましょう。(出ないと読み込みと書き込みにずれが発生して時間にズレが発生します。)

スポンサーリンク
  • 2021 10.10
  • miyabisan2
  • コメントを書く
  • プログラミング全般
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 12.11

    【プログラミング全般】「ステートレス」と「ステートフル」の違い

  2. 2021 08.29

    【プログラミング】「副作用」、フロントエンド開発でイミュータブルが要求される背景など

  3. 2018 03.25

    【プログラミング】バージョンの付け方

  4. 2021 12.12

    【プログラミング全般】プログラミングの歴史

  5. 2023 10.06

    【VSCode】devContainer

  6. 2021 12.08

    【プログラミング全般】「ランタイムライブラリ」と「スタティックライブラリ」の違い、ライブラリの時代変革など

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【JavaScript】時間操作ライブラリ比較(Dat…

【データベース】「JSON型」について

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー