検索
連載

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

本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は、「時間」について。OSの時間はどこから取得されるか、グレゴリオ暦とユリウス暦の境目などの常識と時間に関するクラスについて解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

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

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

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

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


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

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

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

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


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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

現在時刻: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変換

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

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


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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

変換後の値: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変換

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

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


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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

変換後の値:1174368381739


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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

変換後の値: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→「エポックからのミリ秒」変換

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

変換後の値:1174368543223


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る