Javaの時刻の扱い方はUNIXのそれに似ています。 UNIXではグリニッジ標準時(GMT)の1970年1月1日午前0時(UNIX元年の元旦)からの秒数を int 型で数えています。 グリニッジ標準時は正式には世界時(Universal Time)と呼ばれ,天体の運行を基準に定められているので,進み方が一定ではなく,現在では原子時計に基づく協定世界時(UTC,Coordinated Universal Time)を基準にすることが一般的です。 協定世界時はときどき「うるう秒」(23時59分60秒)が入ります。
UNIXの方式は,秒単位なので粗いだけでなく,21世紀のうちに int 型(32ビット整数)の範囲をはみ出してしまいます。
Javaでは System.currentTimeMillis() というメソッドで現在の協定世界時を得ます。 起点はやはり1970年元旦0時ですが,単位は秒でなくミリ秒(milliseconds)にし,Javaの long 型(64ビット整数)で数えます。 これなら,最大の数は 263 - 1 ですから約 1019 秒まで数えられます。 1日が約 105 秒,1年が約 3×1010 ミリ秒ですから,何億年かは大丈夫でしょう。
現在の時刻を表示させてみましょう。
class Test { public static void main(String[] args) { long t = System.currentTimeMillis(); System.out.println("UNIX紀元 " + t + " ミリ秒です。"); } }
たとえば「UNIX紀元 1022416607108 ミリ秒です。」のように表示されたでしょうか。
普通の表し方にするには java.util.Date というクラスを使います。
class Test { public static void main(String[] args) { System.out.println(new java.util.Date()); } }
これを実行すると
Sun May 26 21:37:28 JST 2002
のように出力されます。
このプログラムは次のようにも書けます。
import java.util.*; class Test { public static void main(String[] args) { Date d = new Date(); System.out.println(d); } }
この d は Date 型のオブジェクトで,System.out.println() に渡されたため自動的に文字列型に変換されました。 省略しないで書くと
System.out.println(d.toString());
となります。
日付のフォーマットには java.text.DateFormat クラスを使うのがよいでしょう。
import java.util.*; import java.text.*; class Test { public static void main(String[] args) { Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); System.out.println(df.format(date)); } }
日付だけでよければ
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
時刻だけでよければ
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
とします。
SHORT のところをいろいろ変えてみましょう。 表示が次のように変わります。
SHORT 02/05/26 21:49 MEDIUM 2002/05/26 21:51:34 LONG 2002/05/26 21:49:58:JST FULL 2002年5月26日 21時51分34秒JST
JSTはJapan Standard Time(日本標準時)です。 Java言語ソフト(J2SDK)はアメリカから取ってきたものですが,日本で使っていることを自動認識し,表示も日本語になっていますね。
標準的なフォーマットでは嫌だという場合にこのクラスを使います。
import java.util.*; import java.text.*; class Test { public static void main(String[] args) { Date date = new Date(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd (EE) HH:mm:ss.SSS zz"); System.out.println(df.format(date)); } }
実行すると
2002-05-26 (日) 21:54:55.583 JST
のように表示されます。 yyyy が年(yy なら下2桁), MM が月, dd が日, EE が曜, HH が時(0--23), mm が分, ss が秒, SSS がミリ秒, zz がゾーン名(JST,GMTなど)になります。
import java.util.*; class Test { static final String[] youbi = { " ", "日", "月", "火", "水", "木", "金", "土" }; public static void main(String[] args) { Calendar cal = Calendar.getInstance(TimeZone.getDefault()); cal.setTime(new Date()); int y = cal.get(Calendar.YEAR); // 例: 1997 int m = cal.get(Calendar.MONTH) + 1; // (0..11) + 1 int d = cal.get(Calendar.DATE); // 1..31 int w = cal.get(Calendar.DAY_OF_WEEK); // 1=Sun..7=Sat int h = cal.get(Calendar.HOUR_OF_DAY); // 0..23 int min = cal.get(Calendar.MINUTE); // 0..59 int sec = cal.get(Calendar.SECOND); // 0..59 int ms = cal.get(Calendar.MILLISECOND); // 0..999 System.out.println(y + "年" + m + "月" + d + "日" + youbi[w] + "曜日" + h + "時" + min + "分" + sec + "秒" + ms + "ミリ秒"); } }
月だけはUNIXの習慣にしたがって0〜11の範囲になりますので, 1を加えておきます。
実行すると次のように表示されます。
2002年5月26日日曜日21時56分35秒206ミリ秒
ループの中で使うときは,Date のインスタンスを一つ作っておき,次のように setTime() メソッドを使う方が速くなります。
Date date = new Date(); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("JST")); for (i = 0; i < N; i++) { date.setTime(time[i]); cal.setTime(date); System.out.println(cal.get(Calendar.SECOND)); }
Last modified: 2005-09-22 15:49:22