はじめに
プログラムの世界では、さまざまな「値」を使います。ここでは、値の扱い方について少し掘り下げていくことにしましょう。
まずは、日時の値について。これは意外と重要ですが、慣れない内は使い方がよく分からないものです。そして、普段使っているテキストや数字の値を、さまざまにフォーマットして利用する方法について。これも、例えば「1000 という数字を \1,000 と表示する」というように、値のフォーマットは意外と多用されるものです。こうした、値をいろいろと活用していくための知識についても考えていくことにしましょう。
対象読者
- Javaに興味はある、けれどプログラミング経験がない、という人。
- Javaに興味はある、けれど何から手をつければいいか分からない、という人。
- Javaに興味はない、でも何でもいいからプログラミングをしたい、という人。
日時はカレンダーで管理するのが基本
日時に関する値というのは、実用的なプログラムを作ろうとすると、テキストや数字並みに重要な値となります。が、意外に初心者のうちは使い方を知らないものです。日時の値は、Javaではちょっとばかり複雑です。
前回、スレッドの説明のところで、Calendar
というものを使って現在の日時を表示する方法についてざっと説明しましたが覚えているでしょうか。Calendar
は、カレンダーのためのクラスですが、実をいえばJavaには、もっとシンプルな日時のためのクラスがあります。
Javaでは、日時はjava.utilパッケージにあるDate
というクラスとして用意されています。これは、new Date
とするだけで簡単にインスタンスを作成できます。新規にインスタンスを作成すると、その時点での日時を示すDate
インスタンスが作成されます。また、年月日の値を引数に指定して、特定の日付を示すDate
を作成することもできます(※ただし、これは現在は使いません。詳しくは後述します)。
実際に、Date
を利用する簡単なサンプルを動かしてみましょう。
package codezine.java; import java.util.Date; public class Sample { private static final long serialVersionUID = 1L; public static void main(String args[]) { Date date = new Date(); System.out.println(date); Date date2 = new Date(2001,1,1); System.out.println(date2); } }
ここでは、new Date()
で現在の日時を、new Date(2001,1,1)
で2001年2月1日の日時を、それぞれDate
インスタンスとして作成し、それぞれprintln
で出力しています。単純に日時の値を作ってそのまま出力するだけなら、非常に簡単なことが分かりますね。
Calendarの利用
実際、先ほどのサンプルを自分で試してみたとき、「The constructor Date(int,int,in) is deprecated」といった警告が現れた人も多いはずです。これは、年月日を引数に指定したnew Date
は「非推奨(使うべきではない)」となっているためです。要するに、このやり方は「今は使っちゃダメ!」なのです。
日時を扱うとき、Date
クラスだけを利用して処理するやり方は、今ではほとんど用いられません。Date
クラスは、日時を扱うための最低限の情報しか管理できず、機能的に見ると非常に貧弱なのです。
現実世界では、日時は「暦のシステム」と密接な関係にあります。例えば、「今日は何日?」といった場合、ほとんどの人は西暦や和暦といった暦を使います。暦が違えば、表現される日付も変わってきます。「今日は何日?」と聞かれたとき、「2008年の○月×日」と答える人もいれば、「平成20年の○月×日」と答える人もいるでしょう。または単に「○月×日」と答えるかもしれません。どちらが正しくてどちらが間違っているわけでもありませんね。ただ使っている暦が違うというだけです。平成20年の「今」という時間はどこの世界でも同じであったとしても、それをどう表現するかは、暦によって大きく異なってくるのです。
そこで、Javaでは「暦」のためのクラスを用意し、これを使って日時を表現するように強化されました。これが、java.utilパッケージのCalendar
クラスです。前回登場したクラスです。
これは、暦(カレンダー)の最も基本となるクラスです。一般に、暦というのは西暦(現在のグレゴリオ暦と呼ばれるもの)を使いますが、これはCalendar
を継承して作られているGregorianCalendar
というクラスとして用意されています。私たちが普段使っている「西暦」を使う場合は、このGregorianCalendar
を利用することができます。このクラスは、次のような形でnew
することができます。
new GregorianCalendar(); new GregorianCalendar( 年 , 月 , 日 ); new GregorianCalendar( 年 , 月 , 日 , 時 , 分 ); new GregorianCalendar( 年 , 月 , 日 , 時 , 分 , 秒 );
先のDate
と同様に、引数がない場合、現時点の日時を表すGregorianCalendar
インスタンスが作成されます。引数を指定した場合、指定された日時のGregorianCalendar
インスタンスとなります。