【サンプルプログラム付き】Java時間の取得方法まとめ!

java時間取得
  • このエントリーをはてなブックマークに追加
  • Pocket

Javaで時間を取得する方法をお探しだろうか?

データベースにデータを登録した時間や更新した時間、プログラムの実行速度がどれくらいになるか処理時間を計測するなど、システムにおいて時間を扱うケースは多い。

Javaでは日付に関するクラスから時間を取得することが多いため、時間について意識を向ける機会は少ないだろう。このページでは「時間」に焦点をあててJavaの時間の扱い方についてご紹介する。

Javaでの時間に関するクラスいろいろ

今回は以下のクラスの時間に関する処理について解説する。

クラス

名前空間

内容

Dateクラス

java.util.Date

日付や時間を扱うことができるクラス

Calenderクラス

java.util.Calendar

日付や時間の操作、計算などを扱うことができるクラス

SimpleDateFormatクラス

java.text.SimpleDateFormat

日付や時間の書式に関するクラス

Systemクラス

java.lang.System

標準入出力などシステムに関する処理を行うクラス

 Systemクラスは処理時間の測定に、それ以外のクラスは時間の設定や取得、計算などに使用するケースが多い。なお、JDK1.8からはjava.timeパッケージという新しいクラスが提供されており、そちらでも時間を扱うことができるが、その紹介はまたの機会に行うこととしよう。

タイムゾーンとは

時間に関するクラスを紹介する前に、まずはタイムゾーンという考え方を理解しておく必要がある。

日本と海外では時差があり、それぞれの地域によって標準となる時間が違うことはご存知のことだろう。この地域によって標準として定められている時間のことをタイムゾーンと呼び、協定世界時間からの時間差で表される。

協定世界時間はUTC(Coordinated Universal Time)は世界標準となる時間のことで、セシウム原子時計によって正確に刻まれる時間だ。それぞれのタイムゾーンはUTCからどれくらい時差があるかで表現され、たとえば日本の場合はUTCと9時間の時差があるため「UTC+9」と表現される。

日本の標準時間はJST(Japan Standard Time)で表現され、UTC+9と同じ時間で表現される。国や地域によってタイムゾーンが異なる為、国や地域を特定しないシステムの開発を行う場合、タイムゾーンに注意する必要があるので覚えておこう。

Dateクラス(java.util.Date)

それでは時間を扱うクラスの紹介を始めよう。このDateクラスは初期のJavaから使われており、単純に時間を取得したいだけの時に使うケースが多い。時間の比較などの処理を行うことも可能だが、表示以外の処理は他のクラスで行われることが多くなっている。

主なメソッド

戻り値の型

メソッド

内容

boolean

after(Date dTime)

2つのDateを比較し、指定した日時より後の日時かを判定する。

boolean

before(Date dTime)

2つのDateを比較し、指定した日時より前の日時かを判定する。

Object

clone()

Dateオブジェクトのコピーを戻す。

int

compareTo(Date dTime)

2つのDate型を比較し、同じ日時なら0、引数の日時が前の日時なら正の数値、引数の日時が後の日時なら負の数値を返す。

boolean

equals(Object obj)

2つのDateが同じ日時かどうかを判定する。

String

toString()

Dateを文字にして戻す。

サンプルプログラム

実行結果

プログラムの説明

それではプログラムを簡単に説明しよう。括弧の番号はサンプルプログラムの実行ステップを意味するので、プログラムと実行結果の関係を把握するための参考としてほしい。

  • [1]Dateオブジェクトを新規に作成。
  • [2]処理を1秒間だけ止めている。
  • [3]別のDateオブジェクトを作成。
  • [4]Dateオブジェクトの中身を表示。「JST」というタイムゾーンも表示される。もうひとつのDateオブジェクトは[2]で1秒処理を停止した後に作成したので、1秒だけ違う時間となる。
  • [5]dTime2はdTimeより1秒後なので「true」を返す。
  • [6]dTime2はdTimeより1秒後なので「false」を返す。
  • [7]dTime2とdTimeの時間は異なるので「false」を返す。
  • [8]dTime2の方が後の時間なので「-1」を返す。

Dateは標準化対象から外れたクラス

このクラスはJDK1.1以降、javaの標準化対象から外れてしまったクラスであるため、現在では後で説明するCalendarクラスやSimpleDateFormatクラスを多用することが多い。また、Dateクラスが持つメソッドについても、将来的に廃止される可能性のある「非推奨」メソッドが多く含まれるので、使用する際には注意が必要だ。

Calendarクラス(java.util.Calendar)

CalendarクラスはDateクラスよりも使いやすいクラスで、日時の設定はもちろん、日付や時間の計算なども可能だ。

主なメソッド

戻り値の型

メソッド

内容

Calendar

getInstance()

カレンダーオブジェクトのインスタンスを取得する。

int

get(int field)

指定したカレンダーフィールド(時、分など)の値を返す。

void

set(int field, int value)

指定したカレンダフィールドに値を設定する。

boolean

equals(Object obj)

2つのカレンダーオブジェクトが等しいかどうかを判定する。

void

add(int field, int value)

指定したカレンダーフィールドの値を加算、減算する。

boolean

after(Object obj)

2つのCalendarを比較し、指定した日時より後の日時かどうかを判定する。

boolean

before(Object obj)

2つのCalendarを比較し、指定した日時より前の日時かどうかを判定する。

void

clear()

カレンダーオブジェクトをクリアする。

サンプルプログラム

実行結果

プログラムの説明 

それでは簡単にプログラムの解説をしてゆこう。

  • [1]新しいカレンダーオブジェクトを作成する。
  • [2]作成したカレンダーオブジェクトの時刻のうち時を表示する。この指定だと午前、午後の時間(0-11)が表示される。
  • [3]時刻のうち時を表示するが、HOUR_OF_DAYでは24時間表記で表示される。
  • [4]時刻のうち分を表示する。
  • [5]時刻のうち秒を表示する。
  • [6]時刻のうちミリ秒を表示する。ちなみにミリとは単位の1/1000を指すので、1000ミリ秒=1秒となる。
  • [7]時刻のAM/PMを表示する。AMは「0」、PMは「1」となる。
  • [8]カレンダーに時、分、秒を設定して表示している。
  • [9]処理を1秒間停止させた後で、新しいカレンダーオブジェクトを作成した。
  • [10]cTimeはcTime2と時間が異なるので「false」を返す。
  • [11]cTimeはcTime2より後の時間なので「true」を返す。
  • [12]cTimeはcTime2より後の時間なので「false」を返す。
  • [13]cTime1に1秒加算すると、日付が変わっているのがわかる。
  • [14]カレンダーオブジェクトをクリアするとデフォルトの日時が設定される。

定数を指定すると理解しやすいプログラムに

Calendarオブジェクトの値を取得する際、「HOUR」や「MINUTE」などの文字を指定して値を取得しているが、このような文字のことを「定数」と言う。プログラムに書かれる内容が「0」や「1」だと何を意味するのかわかりにくいが、「MINUTE」だと「分」を意味するのがわかるように、定数とは人間に分かりやすい形で値を表現したものである。

Calendarオブジェクトの時間に関する定数には以下のものがあるので、参考にしてほしい。

Calendar定数

定数

AM_PM

9

HOUR

10

HOUR_OF_DAY

11

MINUTE

12

SECOND

13

MILLISECOND

14

SimpleDateFormatクラス(java.text.SimpleDateFormat)

SimpleDateFormatクラスは日付や時間の書式に関するクラスで、指定した書式で日時を表示することができる。データベースへの日時の登録や画面、帳票への出力など、日時の表現で広く使われているクラスだ。

主なコンストラクタ

コンストラクタ

内容

SimpleDateFormat()

デフォルトの時間書式が設定される。

SimpleDateFormat(String pattern)

パターンで指定した時間書式が設定される。

主なメソッド

戻り値の型

メソッド

内容

void

applyPattern(String pattern)

時間書式を指定する。

StringBuffer

format(Date dt)

指定した時間書式を適用して表示する。

時間の書式について

SimpleDateFormatで使用できる時間に関する書式は以下のとおりだ。

書式

内容

H

1日における時(0~23)

h

午前/午後の時(0~11)

m

s

S

ミリ秒

a

午前/午後

Z

タイムゾーン

サンプルプログラム

実行結果 

プログラムの説明 

それではSimpleDateFormatのサンプルプログラムを簡単に説明しよう。

  • [1]書式を指定してSimpleDateFormatオブジェクトを生成。
  • [2]午前/午後、漢字を指定して表示することもできる。なお「HH」など同じ書式を繰り返すことで、「05時」のようにゼロ埋めで表示できる。
  • [3]24時間表示で表示している。
  • [4]こちらの例ではUTCを表示している。日本で実行しているので「+0900」と表示される。

Systemクラス(java.lang.System)

Systemクラスは名前の通りシステム関連の処理を持つクラスだが、この中でも処理時間の測定に役立つメソッドがあるので紹介しよう。

システム開発で時間がかかる処理がある場合、実際にどれくらい時間がかかるかを測定するケースがあるが、そのような時に役立ててほしい。

主なメソッド

戻り値の型

メソッド

内容

long

currentTimeMillis()

ミリ秒で表現される現在時間を返す

long

nanoTime()

Java仮想マシンの高精度時間ソースの現在値を、ナノ秒の単位で返す

サンプルプログラム

実行結果 

  • [1]startMilliでミリ秒を取得し、ループ処理を1億回行った後でendMilliのミリ秒を取得している。取得したミリ秒の差分を求めると、処理時間がどれくらいかかったかを把握できる。それでは簡単にプログラムの説明をしてみよう。
  • [2]こちらも[1]と同様に2つの処理の差を求めることで処理時間を把握しているが、こちらはナノ秒単位での計測になる。

ミリとナノの違いについて

currentTimeMillisメソッドでミリ秒単位での計測が可能なように思えるのだが、実際にはOSによって計測単位が大きくなってしまうという特徴があり、正確さに欠けるという問題がある。比較的長い処理をざっくりとした時間で計測したいなら使ってもいいかも知れないが、正確さを求める場合はcurrentTimeMillisメソッド使用しない方がいいだろう。

正確な時間を計測したい場合はgetNanoメソッドを使うといい。これは時間を計測するためだけに使うことができるメソッドで、ほぼナノ秒単位での処理時間の計測が可能だ。ちなみに1ミリ秒=1,000,000ナノ秒なので、かなり高い精度で計測することができるのだ。

時間に関するクラスの基礎をおさえておこう

Javaにおける時間に関するクラスの使い方を紹介したが、いかがだっただろうか?

時間に関する処理では12時間表示や24時間表示、午前午後、ミリ秒、ナノ秒など扱う要素が多いため、ここで紹介した基本的な内容は理解しておくようにしよう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*