連載
» 2007年03月28日 00時00分 公開

プログラマーの常識をJavaで身につける(4):OSとプログラミングの「時間」に関する常識 (2/3)

[伊賀敏樹,NTTデータ ビジネスブレインズ]

OSから現在時刻を取得するには?

 現在時刻をOSから取得する方法は、何通りか存在します。その中から主なものを紹介します。

「エポックからのミリ秒」による現在時刻

 現在時刻を表す「エポックからのミリ秒」はjava.lang.SystemクラスのcurrentTimeMillis()メソッドから取得できます。下記のソースコードを実行してください。

CurrentDatetimeSample1.java
public class CurrentDatetimeSample1 {
    public static void main(final String[] args) {
        final long current = System.currentTimeMillis();
        System.out.println("現在時刻: エポックからのミリ秒:"
            + current);
    }
}

実行結果

現在時刻: エポックからのミリ秒:1174366598614


 なお、currentTimeMillis()メソッドのAPIドキュメントにあるように、多くのOSでは、時間の粒度が10ミリ秒程度の単位で計測されるようになっています。

 特に、処理の所要時間を基に割り算を実施する場合には、0による除算が発生する可能性がありますので、ご注意ください。

java.util.Dateによる現在時刻

 現在時刻を表すjava.util.Dateクラスのインスタンスは、パラメータなしのコンストラクタを呼び出すことにより取得できます。下記のソースコードを実行してください。

CurrentDatetimeSample2.java
import java.util.Date;

public class CurrentDatetimeSample2 {
    public static void main(final String[] args) {
        final Date current = new Date();
        System.out.println("現在時刻:" + current.toString());
    }
}

実行結果

現在時刻:Tue Mar 20 13:57:12 JST 2007


java.util.Calendarによる現在時刻

 現在時刻を表すjava.util.Calendarクラスのインスタンスは、getInstanceメソッドを呼び出すことにより取得できます。下記のソースコードを実行してください。

CurrentDatetimeSample3.java
import java.util.Calendar;

public class CurrentDatetimeSample3 {
    public static void main(final String[] args) {
        final Calendar current = Calendar.getInstance();
        System.out.println("現在時刻:" + current.toString());
    }
}

実行結果

現在時刻:java.util.GregorianCalendar[time=1174366821442,areFieldsSet=true,

areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",

offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],

firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=2,

WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=20,DAY_OF_YEAR=79,

DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,

MINUTE=0,SECOND=21,MILLISECOND=442,ZONE_OFFSET=32400000,DST_OFFSET=0]


 CalendarクラスのtoStringの結果はやや可読性に乏しいですね。これを解決するためには、文字列フォーマットを利用することになりますが、これについては後述します。

相互変換で日付・時刻のクラスを使いこなそう!

 「エポックからのミリ秒」とjava.util.Dateとjava.util.Calendarの相互変換には、java.util.Dateクラスやjava.util.Calendarクラスのメソッド(コンストラクタも含む)を利用します。

「エポックからのミリ秒」→java.util.Date変換

ConvertSample1.java
import java.util.Date;

public class ConvertSample1 {
    public static void main(final String[] args) {
        final long current = System.currentTimeMillis();

        // エポックからのミリ秒 → java.util.Date型 変換
        final Date after = new Date(current);

        System.out.println("変換後の値:" + after.toString());
    }
}

実行結果

変換後の値:Tue Mar 20 14:11:23 JST 2007


java.util.Date→java.util.Calendar変換

ConvertSample2.java
import java.util.Calendar;
import java.util.Date;

public class ConvertSample2 {
    public static void main(final String[] args) {
        final Date current = new Date();
        final Calendar after = Calendar.getInstance();

        // java.util.Date型 → java.util.Calendar 変換
        after.setTime(current);

        System.out.println("変換後の値:" + after.toString());
    }
}

実行結果

変換後の値:java.util.GregorianCalendar[time=1174368133239,areFieldsSet=true,

areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",

offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],

firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=2,

WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=20,DAY_OF_YEAR=79,

DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,

MINUTE=22,SECOND=13,MILLISECOND=239,ZONE_OFFSET=32400000,DST_OFFSET=0]


java.util.Calendar→java.uitl.Date変換

ConvertSample3.java
import java.util.Calendar;
import java.util.Date;

public class ConvertSample3 {
    public static void main(final String[] args) {
        final Calendar current = Calendar.getInstance();

        // java.util.Calendar → java.util.Date型 変換
        final Date after = current.getTime();

        System.out.println("変換後の値:" + after.toString());
    }
}

実行結果

変換後の値:Tue Mar 20 14:24:32 JST 2007


java.uitl.Date→「エポックからのミリ秒」変換

ConvertSample4.java
import java.util.Date;

public class ConvertSample4 {
    public static void main(final String[] args) {
        final Date current = new Date();

        // java.util.Date型 → エポックからのミリ秒 変換
        final long after = current.getTime();

        System.out.println("変換後の値:" + after);
    }
}

実行結果

変換後の値:1174368381739


「エポックからのミリ秒」→java.uitl.Calendar変換

ConvertSample5.java
import java.util.Calendar;

public class ConvertSample5 {
    public static void main(final String[] args) {
        final long current = System.currentTimeMillis();
        final Calendar after = Calendar.getInstance();

         // エポックからのミリ秒 → java.util.Calendar変換
        after.setTimeInMillis(current);

        System.out.println("変換後の値:" + after.toString());
    }
}

実行結果

変換後の値:java.util.GregorianCalendar[time=1174368475786,areFieldsSet=true,

areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",

offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],

firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=2,

WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=20,DAY_OF_YEAR=79,

DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,

MINUTE=27,SECOND=55,MILLISECOND=786,ZONE_OFFSET=32400000,DST_OFFSET=0]


java.uitl.Calendar→「エポックからのミリ秒」変換

ConvertSample6.java
import java.util.Calendar;

public class ConvertSample6 {
    public static void main(final String[] args) {
        final Calendar current = Calendar.getInstance();

        // java.util.Calendar → エポックからのミリ秒 変換
        final long after = current.getTimeInMillis();

        System.out.println("変換後の値:" + after);
    }
}

実行結果

変換後の値:1174368543223


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。