プログラミング言語の日付操作まとめ

プログラミング

日付の生成、加算・減算、比較、フォーマットなどの操作は、プログラミングでよくある操作の1つです。

データベースやAPIなどで外部と日付データを送受信する際には、決まったフォーマットにする必要があります。

そのため、プログラミング初心者にとって、日付操作は学習すべき事項の1つとなります。

本ブログでは、JavaScript、Python、Java、Ruby、Goの5つの言語の日付操作について解説してきました。

本記事では、各言語の日付操作についてまとめます。

言語の思想などによる違いも分かり、面白い内容になっていますので、ぜひ最後まで見ていっていただければと思います。

各言語における操作の詳しい説明とソースコードは各記事に記載しています。本記事の最後にリンクを用意しておきますので、気になる方はチェックしてみてください。

プログラミング言語の日付操作まとめ

よくある日付操作として、以下の内容を採り上げます。

  • 日付を扱うクラスやパッケージ
  • 日時の生成方法
  • 日時・曜日の取得方法
  • 日時の加算・減算方法
  • 日時の差分を取得する方法
  • 日時を比較する方法
  • 日時から文字列へフォーマットする方法
  • 文字列から日時へ変換する方法
  • ライブラリの利用

日付を扱うクラスやパッケージ

日付操作で扱う主なクラスやパッケージには以下があります。

言語 クラス・パッケージ
JavaScript
  • Date:日付と時刻を扱う
Python
  • datetime:日付と時刻を扱う
  • date:日付のみを扱う
  • time:時刻のみを扱う
  • timedelta:時間差を扱う
Java
  • Date:日付と時刻を扱う
  • Calendar:Dateでは出来ない日付操作を行う
  • LocalDateTime:日付と時刻を扱い、日付操作もできる(利用推奨)
Ruby
  • Date:日付のみを扱う
  • DateTime:日付と時刻を扱う
  • Time:日付と時刻を扱い、サマータイムやうるう秒に対応している(利用推奨)
Go
  • time:日付と時刻を扱う

JavaScriptとGoについては、基本的には1択で、Dateオブジェクト、timeパッケージを利用します。

Pythonは関連するクラスはいくつかありますが、基本的にはdatetimeを使い、必要に応じて他を利用します。

JavaとRubyは同様のことができるクラスがいくつか用意されていますが、特別な理由がなければ、JavaはLocalDateTimeクラス、RubyはTimeクラスを使うのが良いでしょう。

日時の生成方法

言語 日時の生成方法
JavaScript
  • 現在時刻で生成:newによるオブジェクト生成
  • 任意の日時で生成:オブジェクト生成時のコンストラクタに指定
Python
  • 現在時刻で生成:today、now
  • 任意の日時で生成:datetime
  • 日付と時刻から生成:combine
Java
  • 現在時刻で生成:now
  • 任意の日時で生成:of
  • 日付と時刻から生成:of
Ruby
  • 現在時刻で生成:new
  • 任意の日時で生成:local
Go
  • 現在時刻で生成:Now
  • 任意の日時で生成:Date

JavaScriptはDateオブジェクトをnewして日時情報を生成します。この際に引数に日時情報を指定することで、任意の日時で生成することができますが、月の情報は作成したい月に-1する点に注意が必要です。
他の言語では、作成したい月をそのまま指定することで作成できます。

PythonやJavaは、日付だけを扱うクラス、時刻だけを扱うクラスが用意されているので、その2つから日時を生成することも出来るようになっています。

日時・曜日の取得方法

言語 日時・曜日の取得方法
JavaScript
  • 日時:各属性値を返すメソッドで取得
  • 曜日:getDayで0~6の数値を取得(0が日曜日)
Python
  • 日時:各属性値にアクセスして取得
  • 曜日:weekdayで0~6の数値を取得(0が月曜日)、isoweekdayで1~7の数値を取得(1が月曜日)
Java
  • 日時:各属性値を返すメソッドで取得
  • 曜日:getDayOfWeekで取得。数値で取得するにはさらにgetValueを呼出して1~7の数値を取得(1が月曜日)
Ruby
  • 日時:各属性値を返すメソッドで取得
  • 曜日:wdayで0~6の数値を取得(0が日曜日)、該当曜日かどうかをBooleanで返すメソッドもある
Go
  • 日時:各属性値を返す関数で取得
  • 曜日:Weekdayで0~6の数値を取得(0が日曜日)

各言語ともに、年や月などの各属性値を取得するための方法が提供されています。
JavaScriptだけは、月の値を実際月-1で返すので注意が必要です。

曜日で取得できる数値は、返す値の範囲と数値の意味が言語によってバラバラのため、実装時には注意が必要です。

日時の加算・減算方法

言語 日時の加算・減算方法
JavaScript
  • 加算:setXXXメソッドに現在値に加算した値を指定
  • 減算:setXXXメソッドに現在値から減算した値を指定
Python
  • 加算:timedeltaに加算値を指定して、+演算子に指定
  • 減算:timedeltaに減算値を指定して、-演算子に指定
Java
  • 加算:plusXXXメソッドに加算値を指定
  • 減算:minusXXXメソッドに減算値を指定
Ruby
  • 加算:+メソッドに加算する秒で指定
  • 減算:-メソッドに減算する秒を指定
Go
  • 加算:AddDateに加算する年月日を指定、またはAddに加算するナノ秒を指定
  • 減算:AddDateに減算する年月日をマイナス値で指定、またはAddに加算するナノ秒をマイナス値で指定

Python、Ruby、Goは差分を表すオブジェクトやインスタンスを作成し、日時に対して加減算を行います。

JavaScript、Javaは日時の各属性値に対して、直接加減算を行います。

日時の差分を取得する方法

言語 日時の差分を取得する方法
JavaScript
  • Date同士をエポックミリ秒に変換後に減算して取得
Python
  • datetime同士を減算して差分をtimedeltaで取得
Java
  • ChronoUnitのbetweenで取得
  • Period/Durationのbetweenで取得
Ruby
  • Time同士を減算して差分を秒で取得
Go
  • Sub関数で差分をナノ秒で取得

どの言語も日時情報同士をメソッドなどを使い、差分を取得します。

差分を表す単位はクラスであったり、秒であったり、ナノ秒であったりと言語によりバラバラです。

日時を比較する方法

言語 日時を比較する方法
JavaScript
  • Date同士をエポックミリ秒に変換後、比較演算子を使って比較
Python
  • datetime同士を直接比較演算子を使って比較
Java
  • isAfter/isBefore/isEqualメソッドを使って比較
Ruby
  • Time同士を直接比較演算子を使って比較
  • Time同士を<=>メソッドを使って比較
Go
  • After/Before/Equal関数を使って比較

JavaScriptは数値に変換してから比較、PythonとRubyはクラス同士を直接比較、JavaとGoは専用の操作で比較と言語により方法が異なります。

日時から文字列へフォーマットする方法

言語 日時から文字列へフォーマットする方法
JavaScript
  • 予め定義されたフォーマット形式で返す専用メソッドを使用
  • テンプレートリテラルで文字列を組み立ててフォーマット
Python
  • strftimeに書式を指定してフォーマット
Java
  • DateTimeFormatterに書式を指定し、formatメソッドでフォーマット
Ruby
  • strftimeに書式を指定してフォーマット
Go
  • Formatに書式を指定してフォーマット

JavaScriptは、書式指定によるフォーマットが提供されておらず、若干手間がかかります。

JavaScript以外は、書式指定により好きなフォーマットに変換することが可能です。

文字列から日時へ変換する方法

言語 文字列から日時へ変換する方法
JavaScript
  • parseに文字列からエポックミリ秒に変換後、Dateのコンストラクタに指定して変換
Python
  • strptimeに文字列と書式を指定して変換
Java
  • parseに文字列とDateTimeFormaaterによる書式を指定して変換
Ruby
  • parseに文字列を指定して変換
  • strptimeに文字列と書式を指定して変換
Go
  • Parseに書式と文字列を指定して変換

JavaScriptは、書式を指定できないためブラウザなどの環境により変換可否が変わる可能性があるため注意が必要です。

JavaScript以外は、書式を指定することで、自由な形式の文字列でも日時に変換することができます。

ライブラリの利用

言語 よく使われるライブラリ
JavaScript
  • Moment.js(メンテナンス終了)
  • Luxon.js
Python
  • dateutil
  • arrow
Java
  • Apache Commons Lang
  • Joda Time
Ruby
  • Active Support
Go
特になし

Javaについては、LocalDateTimeを使用していれば大抵の操作は出来るため、あえてライブラリを使うことはないかもしれません。

Goについては、これと言ったライブラリはまだありませんが、今後出てくる可能性はあります。

日付操作には十分なテストが必要

日付と文字列を変換していると、環境によって時間が変わってしまうことがあります。

また、クライアントとサーバで日時をやり取りすると時間がが変わってしまうなどもあります。

こうした環境による時間の変化は、タイムゾーンが原因であることが考えられます。

実際のプロジェクトでは、データベースはどのタイムゾーンなのか、サーバはどのタイムゾーンで設定するのか、クライアントはどのタイムゾーンで表示するのかといったことを最初に決めておく必要があります。

これらを統一しておかないと、意図せず異なった日時で保存されてしまったり、間違った時間を元に処理が動いてしまったりといったことが発生します。

また、うるう年やうるう秒など、特定の時にだけ発生する時間差などもあります。

過去にもこうした対策がきちんと行われていないことが原因で、大きなトラブルになった事例もあります。

日付を扱う際には、実装時にも注意し、テストを十分に行うことをおすすめします。

今回はプログラミング言語の日付操作についてまとめました。

参考になれば幸いです。

関連記事

各言語のソースコードと詳しい解説は下記の記事をご覧ください。

JavaScriptの日付操作【プログラミング初心者向け教材】
日付の生成、加算・減算、比較、フォーマットなどは、業務上でよくある操作の1つです。 また、多くのデータベースやAPIの操作には、日付を決められたフォーマットにする必要もあり、日付操作はプログラミングにおいて学習すべき事項となります。 本記事では、JavaScriptのよく使われる日付操作について解説します。
Pythonの日付操作【プログラミング初心者向け教材】
日付の生成、加算・減算、比較、フォーマットなどは、業務上でよくある操作の1つです。 また、多くのデータベースやAPIの操作には、日時を決められたフォーマットにする必要があり、プログラミングにおいて日付操作は学習すべき事項となります。 本記事では、Pythonのよく使われる日付操作について解説します。
Javaの日付操作【プログラミング初心者向け教材】
日付の生成、加算・減算、比較、フォーマットなどは、業務上でよくある操作の1つです。 また、多くのデータベースやAPIの操作には、日時を決められたフォーマットにする必要があり、プログラミングにおいて日付操作は学習すべき事項となります。 本記事では、Javaのよく使われる日付操作について解説します。
Rubyの日付操作【プログラミング初心者向け教材】
日付の生成、加算・減算、比較、フォーマットなどは、業務上でよくある操作の1つです。 また、多くのデータベースやAPIの操作には、日時を決められたフォーマットにする必要があり、プログラミングにおいて日付操作は学習すべき事項となります。 本記事では、Rubyのよく使われる日付操作について解説します。
Goの日付操作【プログラミング初心者向け教材】
日付の生成、加算・減算、比較、フォーマットなどは、業務上でよくある操作の1つです。 また、多くのデータベースやAPIの操作には、日時を決められたフォーマットにする必要があり、プログラミングにおいて日付操作は学習すべき事項となります。 本記事では、Goのよく使われる日付操作について解説します。

コメント

タイトルとURLをコピーしました