開発中の日時のあつかい

経験の浅い頃は、

Calendar now = Calendar.getInstance();
Date date = now.getTime();

とか

date '+%Y%m%d%H%M%S'

するのさえめずらしくて、ソースコードのところかまわず、日時を取得しまくっていた。

だけど、少し経験を積むと、これが厄介のたねになることに気づく。

自分のPCでのテストだけならともかく、共通のテスト環境で結合試験する時には、Linuxのシステム日時をかんたんに変えることなんてできなくて、自由に日時を変えることができなくて、泣きを見ることになる。それでもテストでは、日時は自由に設定したくてしょうがない。

いくつかの現場で経験してきた日時のあつかいは、

  • 日時は、自分たちで準備した共通のAPIから取得する。
  • 日時の取得は、システム日時だけでなく、日時ファイルからも取得できるようにして、必要に応じて、どちらから取得するかを切り替えられるように共通のAPIをつくっておく。
  • 日時の取得は、システム日時だけでなく、データベースの日時テーブルからも取得できるようにして、必要に応じて、どちらから取得するかを切り替えられるように共通のAPIをつくっておく。
  • シェルスクリプトJavaで共通の日時をあつかえるようにする。
  • 特に、データベースのトランザクションの処理では、はじめに1回だけ日時を取得して、トランザクションの処理では、それをつかいまわす。
  • JUnitを書きながらの開発だと、日時のあつかいは自然と注意したくなる気がする。注意しないと、実行するたびに、assertを変えなきゃいけなくなる。
    • また、べつの話だけど、データベースの自動採番とかもそうだよなー。
  • 日単位の処理は、http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/time/DateUtils.html#truncate(java.util.Date, int)などで、切捨てをうまくおこなう。
  • 日単位の処理は、等号でなくて、1日分足して、不等号で処理する

とかだろうか。