時間や日付 – エンジニアの入り口 https://eng-entrance.com 「エンジニアの入り口」は、プログラミング入門やエンジニアリング入門の知識が満載の初心者のための勉強サイトです。プログラミングやサーバ、ネットワークの基礎知識や勉強方法を習得できます。 Mon, 17 Jul 2017 06:28:26 +0000 ja hourly 1 https://wordpress.org/?v=5.2.19 【Java】タイムゾーンを設定するTimeZoneクラスの使い方! https://eng-entrance.com/java-time-timezone https://eng-entrance.com/java-time-timezone#respond Tue, 18 Oct 2016 00:04:44 +0000 http://eng-entrance.com/?p=3082 Javaでタイムゾーンを表示したり、操作したりしたいときはTimeZoneクラスを使う。

このページではTimeZoneクラスについてまとめた。サンプルコードも用意しているので、参考になるはずだ。

JavaのTimeZoneクラス

タイムゾーンとは?

「時差」があるように地域によって、時間は違う。同じ時間を扱う地域をタイムゾーンという。

イギリスのグリニッジを中心に15度ずつ分割されたものだ。360度÷24時間=15度のため、このように決められている。

日本は韓国やインドネシアと同じタイムゾーンにある。日本国内は同一時間なので、タイムゾーンを意識する機会はあまりないと思うが、国をまたがって使われるアプリケーションやサーバーが外国にあるなどの場合、日付処理の際にその地域のタイムゾーンを意識することが必要だ。

Javaのタイムゾーン

Javaでタイムゾーンは、java.utilパッケージにあるTimeZoneクラスで扱うことができる。TimeZoneクラスを用いれば、世界各地の日付や時間の情報を取得して表示や利用することができるようになる。

主なタイムゾーンID

次のようなタイムゾーンが用意されている。

タイムゾーン

タイムゾーンID

日本標準時

Asia/Tokyo

グリニッジ標準時

Europe/London

アラビア標準時

Asia/Kuwait

東部標準時

America/New_York

太平洋標準時

America/Los_Angeles

ハワイ標準時

US/Hawaii

オブジェクトの取得

TimeZoneクラスは抽象クラスなので、new演算子を使って生成できない。オブジェクトの取得は以下のようになる。

デフォルトタイムゾーンを取得するTimeZone.getDefault ()

戻り値の型

Public static TimeZone

内容

 デフォルトのタイムゾーンを持つ、TimeZoneオブジェクトを取得する。

タイムゾーンIDを指定するTimeZone.getTimeZone(String ID)

戻り値の型

Public static TimeZone

内容

引数に指定されたタイムゾーンIDに基づいた、TimeZoneオブジェクトを取得する。

主なメソッド

主なメソッドは次の通りだ。

IDの一覧を取得するTimeZoneオブジェクト. getAvailableIDs( )

戻り値の型

Public String[]

内容

サポートされる利用可能な ID をすべて取得する。

戻り値:

ID の配列

タイムゾーン名を返すTimeZoneオブジェクト. getDisplayName( )

戻り値の型

Public String

内容

デフォルトロケールでの現在のタイムゾーンの名前を、ユーザーへの表示に適した形式で返す。このメソッドは、長い名前を返す。 ( 夏時間は含まれない)

ロケールの表示名がない場合、このメソッドは規定化されたカスタム ID 形式で文字列を返す。

戻り値:

デフォルトロケールでの現在のタイムゾーンを、人が理解できる形式にした名前

現在のタイムゾーンを取得するTimeZoneオブジェクト. getID( )

戻り値の型

Public String

内容

現在の所在地のタイムゾーンの ID を取得する。

戻り値:

現在の所在地のタイムゾーンの ID

タイムゾーンIDを設定するTimeZoneオブジェクト. setID( String ID)

戻り値の型

void

内容

タイムゾーン ID を設定する。

引数:

ID - 新しいタイムゾーン ID

これらのメソッドが用意されているので、状況に応じて使い分けていけばいいだろう。

タイムゾーンに関するTimeZoneクラスサンプルコード

Calendarクラスを使用したサンプルコード

public class TimeZoneSample1 {
    public static void main(String[] args) {
        TimeZone tzn1 = TimeZone.getDefault();//[1]
        Calendar cal1 = Calendar.getInstance(tzn1);//[2]
        System.out.println("タイムゾーンID : " + tzn1.getID());//[3]
        System.out.println("タイムゾーン : " + tzn1.getDisplayName());//[4]
        System.out.println("日時 : " + cal1.get(Calendar.YEAR) + "/" 
                + (cal1.get(Calendar.MONTH) + 1) + "/"
                + cal1.get(Calendar.DAY_OF_MONTH) + " "
                + cal1.get(Calendar.HOUR_OF_DAY) + ":" 
                + cal1.get(Calendar.MINUTE) + ":" 
                + cal1.get(Calendar.SECOND));//[5]

        TimeZone tzn2 = TimeZone.getTimeZone("US/Hawaii");
        cal1.setTimeZone(tzn2);//[6]
        System.out.println("タイムゾーンID : " + tzn2.getID());//[7]
        System.out.println("タイムゾーン : " + tzn2.getDisplayName());//[8]
        System.out.println("日時 : " + cal1.get(Calendar.YEAR) + "/" 
                + (cal1.get(Calendar.MONTH) + 1) + "/"
                + cal1.get(Calendar.DAY_OF_MONTH) + " "
                + cal1.get(Calendar.HOUR_OF_DAY) + ":" 
                + cal1.get(Calendar.MINUTE) + ":" 
                + cal1.get(Calendar.SECOND));//[9]
    }
}

実行結果

タイムゾーンID : Asia/Tokyo
タイムゾーン : 日本標準時
日時 : 2016/9/5 22:50:17
タイムゾーンID : US/Hawaii
タイムゾーン : ハワイ標準時
日時 : 2016/9/5 3:50:17

サンプルコードの説明

  • [1] デフォルト情報のタイムゾーンオブジェクトtzn1を取得。
  • [2] tzn1をもとにCalendarオブジェクトcal1を取得。
  • [3] getID メソッドを使用してtzn1のタイムゾーンIDを表示。
  • [4] getDisplayName メソッドを使用し、tzn1のタイムゾーンを表示
  • [5] cal1の日付情報を表示。
  • [6] タイムゾーンID "US/Hawaii”のタイムゾーンオブジェクトtzn2を取得。
  • [7] Calendarオブジェクトcal1にタイムゾーンtzn2を設定。
  • [8] tzn2のタイムゾーンIDを表示。
  • [9] tzn2のタイムゾーンを表示
  • [10]cal1の日付情報を表示。

Dateクラスを使用したサンプルコード

public class TimeZoneSample2 {
    public static void main(String[] args) {
        TimeZone tzn = TimeZone.getTimeZone("Europe/London");//[1]
        SimpleDateFormat fmt = new SimpleDateFormat();
        Date date = new Date();
        System.out.println("現在の日付情報 : " + fmt.format(date));//[2]
        fmt.setTimeZone(tzn);
        System.out.println("Europe/Londonのタイムゾーンでの日付情報 : " + fmt.format(date));//[3]
    }
}

実行結果

現在の日付情報 : 16/09/05 23:04
Europe/Londonのタイムゾーンでの日付情報 : 16/09/05 15:04

サンプルコードの説明

  • [1] getTimeZoneメソッドを使用し、タイムゾーンID Europe/Londonを設定したタイムゾーンオブジェクトtznを取得。
  • [2] Dateオブジェクトdateを生成し実行時の日付情報を取得。SimpleDateFormatオブジェクトfmtで書式を設定した文字列に変換して表示。
  • [3] fmtにsetTimeZone メソッドを使用してtznを設定。文字列に変換して表示。

Calendarクラスと違いDateクラスではタイムゾーンが考慮されておらず、関連するメソッドは用意されていない。

その場合サンプルコードのようにSimpleDateFormatのsetTimeZoneメソッドを使用してタイムゾーンを設定して表示できるので参考にしていただきたい。

まとめ

このページではJavaのタイムゾーンを扱うTimeZoneクラスについてまとめてきた。

アプリケーションをグローバル展開するときなど、必ず使うクラスになっている。ぜひ、この機会に使い方を理解しておこう。

]]>
https://eng-entrance.com/java-time-timezone/feed 0
【Java入門】日付のフォーマットを変更できるSimpleDateFormatクラス https://eng-entrance.com/java-time-simpledateformat https://eng-entrance.com/java-time-simpledateformat#comments Mon, 17 Oct 2016 01:00:11 +0000 http://eng-entrance.com/?p=3051 SimpleDateFormatクラスはJavaで日付のフォーマットを変更したり、文字列を日付オブジェクトに変えたりするために利用されるクラスだ。

このページではサンプルコードも含めてSimpleDateFormatについて解説した。日付の書式を変更したいときに利用いただければと思う。

JavaのSimpleDateFormatクラス

SimpleDateFormatクラスは、日付オブジェクトの書式を設定した文字列に変換して表示したり、文字列を日付オブジェクトに変換したりするjava.textパッケージにあるクラスだ。

同じくjava.textパッケージにあるDateFormatクラスを継承している。そのためDateFormatクラスのメソッドも使用できるのでAPIを調べるときは気を付けよう。

まずはJavaでの日付フォーマットのルールを確認しよう。

Javaでの日付フォーマット

日付フォーマットのルールは次の通りだ。

文字

意味

yy

西暦年(2桁)

2016年 → 16

yyyy

西暦年(4桁)

2016年 → 2016

M

9月 → 9

MM

月(ゼロ埋め)

9月 → 09

D

年に対する日

9月5日 → 249

DDD

年に対する日(ゼロ埋め)

1月1日 → 001

d

月に対する日

9月5日 → 5

dd

月に対する日(ゼロ埋め)

9月5日 → 05

w

年に対する週

2016年9月5日 → 37

W

月に対する週

2016年9月5日 → 2

E

曜日

2016年9月5日 → 月

F

月に対する曜日番号

2016年9月5日 → 1

a

午前午後

17時56分 → 午後

h

時(12時間制)

17時 → 5

hh

時(12時間制 ゼロ埋め)

17時 → 05

H

時(24時間制)

17時 → 17

HH

時(24時間制 ゼロ埋め)

6時 → 06

m

9分 → 6

mm

分(ゼロ埋め)

9分 → 09

s

6秒 → 6秒

ss

秒(ゼロ埋め)

3秒 → 03秒

S

ミリ秒

99ミリ秒 → 99

SSS

ミリ秒(ゼロ埋め)

99ミリ秒 → 093

ここからは細かい説明に入っていくが、とりあえずの使い方を知りたいという方はサンプルコードまで飛んでいただければと思う。下の方に用意しているので、そこまでカーソルを。

コンストラクタ

コンストラクタは次のようになっている。

SimpleDateFormat()

引数

なし

内容

 デフォルトパターン(yy/MM/dd H:mm)と日付フォーマット記号を使って SimpleDateFormat を生成する。

SimpleDateFormat(String pattern)

引数

pattern 日付・時刻の書式(パターン)

内容

引数で渡されたパターンとデフォルトの日付フォーマット記号を使って SimpleDateFormat を生成する。

SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)

引数

pattern          日付・時刻の書式(パターン)

formatSymbols   日付フォーマット記号

内容

 引数で渡されたパターンと日付フォーマット記号を使って SimpleDateFormat を生成する。

主なメソッド

続いてメソッドだ。SimpleDateFormatでは次のような各種メソッドが用意されている。

文字列を日付フォーマットにする

SimpleDateFormatオブジェクト. applyPattern  (String pattern)

戻り値の型

void

内容

指定されたパターン文字列を、この日付フォーマットに適用する。

引数:

pattern - この日付フォーマットのための新しい日付と時刻のパターン

例外:

・指定されたパターンが null の場合NullPointerExceptionが発生する。

- 指定されたパターンが正しくない場合IllegalArgumentException が発生する。

指定されたDateを日付文字列にフォーマットする

SimpleDateFormatオブジェクト.format(Date date)

戻り値の型

Public StringBuffer

内容

指定された Date を日付/時刻文字列にフォーマットし、指定された StringBuffer に結果を追加する。

引数:

date - 日付/時刻文字列にフォーマットする日付/時刻値

戻り値:

フォーマットされた日付/時刻文字列

例外:

指定された日付が null の場合、実行時にNullPointerExceptionが発生する。

文字列から解析してDateオブジェクトを生成する

SimpleDateFormatオブジェクト.parse(String text)

戻り値の型

Public Date

内容

文字列からテキストを解析して Date オブジェクトを生成する。

引数:

text - 部分的に解析される String

戻り値:

文字列から解析される Dateオブジェクト。エラーの場合は null を返す

例外:

 text が null の場合NullPointerException が発生する。

上と同じだが、エラー時の処理が違う

SimpleDateFormatオブジェクト.parse(String text, FieldPosition pos)

戻り値の型

Public Date

内容

文字列からテキストを解析して Date オブジェクトを生成する。

エラーが発生した場合、posへエラーインデックスが設定されDateオブジェクトにはnullが設定される。

引数:

text - 部分的に解析される String

pos - 上記のインデックスおよびエラーインデックス情報を持つ ParsePosition オブジェクト

戻り値:

文字列から解析される Dateオブジェクト。エラーの場合は null を返す

例外:

 text または pos が null の場合NullPointerException が発生する。

日付フォーマットを記述するパターン文字列を返す

SimpleDateFormatオブジェクト.toParttern()

戻り値の型

Public String

内容

この日付フォーマットを記述するパターン文字列を返します。

戻り値:

この日付フォーマットを記述するパターン文字列

SimpleDateFormatクラスのサンプルコード

それでは実際のサンプルコードを確認していこう。

日付オブジェクトから文字列へ変換するサンプルコード

public class SimpleDateFormatSample {
    public static void main(String[] args) {
        Date today = new Date();
        System.out.println("書式を設定せずに表示:" + today);//[1]
        SimpleDateFormat format1 = new SimpleDateFormat();
        System.out.println("日付書式の初期値:" + format1.toPattern());//[2]
        System.out.println("初期設定の書式で表示:" + format1.format(today));//[3]
        SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月dd日 E曜日 H時mm分");
        System.out.println("yyyy年MM月dd日 E曜日 H時mm分の書式で表示:" + format2.format(today));//[4]
    }
}

実行結果

書式を設定せずに表示:Mon Sep 05 16:59:21 JST 2016
日付書式の初期値:yy/MM/dd H:mm
初期設定の書式で表示:16/09/05 16:59
yyyy年MM月dd日 E曜日 H時mm分の書式で表示:2016年09月05日 月曜日 16時59分

サンプルコードの説明

  • [1] Dateオブジェクトtodayを生成し、実行時の日時情報を取得。書式は表示せずに表示。
  • [2] SimpleDateFormatオブジェクトformat1を引数なしで生成。toPatternメソッドを使って初期値として設定されている書式パターンを表示。
  • [3] todayを、formatメソッドを使用してのformat1の書式の文字列に変換して表示。
  • [4] SimpleDateFormatオブジェクトformat2を「yyyy年MM月dd日 E曜日 H時mm分」の書式パターンで生成。todayをformatメソッドを使ってformat2の指定書式の文字列に変換して表示。

文字列を日付オブジェクトへ変換するサンプルコード

続いては、文字列を日付オブジェクトへ変換するコードだ。

public class SimpleDateFormatSample1 {
    public static void main(String[] args) {
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd");
        String strDate = "2016/09/15";
	ParsePosition pos = new ParsePosition(0);
	Date date = fmt.parse(strDate, pos);//[1]
        System.out.println(strDate + "をDateオブジェクトへ変換 → " + date);//[2]
	System.out.println("変換時のエラー位置 → " + pos.getErrorIndex());//[3]
        String strDate1 = "2016//09/15";
	pos = new ParsePosition(0);
	date = fmt.parse(strDate1, pos);//[4]
	System.out.println(strDate1 + "をDateオブジェクトへ変換 → " + date);//[5]
	System.out.println("変換時のエラー位置 → " + pos.getErrorIndex());//[6]
        
        try {
            date = fmt.parse(strDate1);//[7]
        } catch (ParseException ex) {
            System.out.println("エラーが発生しました。" + ex);//[8]
        }
    }
}

実行結果

2016/09/15をDateオブジェクトへ変換 → Thu Sep 15 00:00:00 JST 2016
変換時のエラー位置 → -1
2016//09/15をDateオブジェクトへ変換 → null
変換時のエラー位置 → 5
エラーが発生しました。java.text.ParseException: Unparseable date: "2016//09/15"

サンプルコードの説明

  • [1]パターンyyyy/MM/ddを設定したSimpleDateFormatオブジェクトfmtを生成。”2016/09/05”を代入した変数strDateをparseメソッドを使用してDateオブジェクトdateへ変換。
  • [2] dateを表示。
  • [3] 文字列を日付型に変換する際の解析位置を保持するParsePositionオブジェクトの変数posのエラー位置を表示。エラーがなかった場合は「-1」が表示される。
  • [4] 日付としては不正な文字列”2016//09/05”を代入した変数strDate1を、paseメソッドを使用してDateオブジェクトへ変換。
  • [5] エラーが発生することなく処理は実行されるが、生成されたDateオブジェクトを表示するとnullとなる。
  • [6] 解析エラー発生位置「5」が表示される。[7] parseメソッドで変換する際に、ParsePositionオブジェクトは渡さず文字列だけ渡して文字列からDateオブジェクトへの変換処理を実行すると、実行時にエラー発生。

まとめ

このページでは、Javaで日付のフォーマットを変更できるSimpleDateFormatクラスについてまとめてきた。

日付のフォーマットを思うように決めたいときは、プログラミングをしていてよくあることだ。SimpleDateFormatは活用できるようにしておこう。

]]>
https://eng-entrance.com/java-time-simpledateformat/feed 3
【すぐ使える】日付を扱うJavaのDateクラスの使い方 https://eng-entrance.com/java-time-date https://eng-entrance.com/java-time-date#respond Sat, 15 Oct 2016 23:42:59 +0000 http://eng-entrance.com/?p=3047 Javaで日付を扱う型は色々とあるが、もっとも有名なもののひとつがDateクラスだろう。

このページではDateクラスの使い方についてまとめている。便利なクラスなので、ぜひ使い方をマスターしていただければと思う。

JavaのDateクラス

最新のJava8では新しい日付クラスが登場し、これから説明するDateクラスに代わるクラスが推奨されるが、このページではDateクラスについて見ていく。

Dateは日付を扱うクラス

Dateクラスはjava.utilパッケージにある日付を扱うクラスだ。今日の日付を取得したい時や日付の比較、特定の日付と比較対象の日付が過去か未来かなどの判定を行う機能を提供している。

Dateクラスには特定の日時をセットして日付情報を作るメソッドも用意されているが、現在は非推奨となっている。 特定の日時のセットや、日時の計算を行いたい場合は、同じくjava.utilパッケージに存在するCalendarクラスを使用するようにしよう。

Dateクラスのオブジェクトの作り方

Dateクラスのオブジェクトの生成方法はこうだ。

new Date()

戻り値の型

public Date

内容

Dateクラスのオブジェクトを生成し、その生成された時刻を、もっとも近いミリ秒単位で表す。

new Date(long date)

戻り値の型

public Date

内容

オブジェクトを生成し、引数で渡されたミリ数秒で初期化する。

引数

date - 1970 年 1 月 1 日 00:00:00 GMT から経過したミリ秒数

Dateクラスは世界標準時エポック(1970/1/1)からのミリ秒で時間を表す。new演算子を使用して引数なしのオブジェクトを生成すると、現在時刻のDateオブジェクトが生成される。

  • GMTは世界標準時(Greenwich Mean Time)の略称だ
  • ミリ秒 → 1秒の1000分の1

Dateクラスのメソッド

それではDateクラスのメソッドをご紹介していこう。

とりあえずの使い方が知りたいという方は、下に載せているサンプルコードを見ていただくのが手っ取り早いだろう。

時間を取得するDateオブジェクト.getTime()

戻り値の型

Public long

内容

Dateオブジェクトが1970 年 1 月 1 日 00:00:00 GMT から経過したミリ秒数を返す。

戻り値:

1970 年 1 月 1 日 00:00:00 GMT から経過したミリ秒数

 

時間を設定するDateオブジェクト.setTime(long time)

戻り値の型

public void

内容

1970 年 1 月 1 日 00:00:00 GMT から time ミリ秒経過した時点を設定する。

引数:

time - ミリ秒数

前の日付かを判定するDateオブジェクト.before(Date when)

戻り値の型

Public boolean

内容

この日付が、指定された日付より前(過去)にあるかどうかを判定する。

引数:

when - 日付

戻り値:

Date オブジェクトが表す時点が 引数when の表す時点より早い場合だけ true、そうでない場合は false

例外:

- when が null の場合の、エラー(NullPointerException)が発生する。

後の日付かを判定するDateオブジェクト.after(Date when)

戻り値の型

Public boolean

内容

この日付が、指定された日付より後(未来)にあるかどうかを判定する。

引数:

when - 日付

戻り値:

Date オブジェクトが表す時点が 引数when の表す時点より遅い場合だけ true、そうでない場合は false

例外:

 - when が null の場合の、エラー(NullPointerException)が発生する。

同じ日付かどうかを確認するDateオブジェクト.equals(Object obj)

戻り値の型

Public boolean

内容

2 つの日付が等しいかどうかを比較する。引数が null ではなく、かつ、このオブジェクトとミリ秒まで同じ時点を表す Date オブジェクトであれば、true を返す。

引数:

obj - 比較対象のオブジェクト

戻り値:

オブジェクトが同じである場合は true、そうでない場合は false

日付を比較するDateオブジェクト.compareTo(Date anotherDate)

戻り値の型

Public int

内容

順序付けのために 2 つの Date を比較する。

引数:

anotherDate - 比較対象の Date

戻り値:

引数 anotherDate がこの Date と等しい場合は値 0。この Date が引数 anotherDate より前の場合は 0 より小さい値。この Date が引数 anotherDate より後の場合は 0 より大きい値

例外:

anotherDate が null の場合、エラー(NullPointerException)が発生する。 

Dateクラスのサンプルコード

それではDateクラスのサンプルコードを確認してみよう。

サンプルコード

public class DateSample {
    public static void main(String[] args) {
        Date date1 = new Date();//[1]
        Date date2 = new Date(date1.getTime());//[2]
         System.out.println("date1の情報:" + date1);//[3]
        System.out.println("date1とdate2は同じかどうか:" + date1.compareTo(date2)); //[4]

        Calendar gantan = Calendar.getInstance(); 
        gantan.set(2016, 0, 1);
        Date dateGantan = gantan.getTime();//[5]
        
         System.out.println("date1は2016年元旦より未来か :" + dateGantan.after(date1));//[6]
         System.out.println("date1は2016年元旦より過去か :" + dateGantan.before(date1));//[7]
    }
}

実行結果

date1の情報:Sat Sep 03 12:48:52 JST 2016
date1とdate2は同じかどうか:0
date1は2016年元旦より未来か :false
date1は2016年元旦より過去か :true

サンプルコードの説明

  • [1] Dateオブジェクトを生成し、実行時の日時情報を代入。
  • [2] date1からgetTime()メソッドで取得した1970年から実行時までの経過ミリ秒をパラメータとして渡して、オブジェクトを生成。
  • [3] date1の情報を表示。(内部的にtoString()を実行し情報を文字列で表示する)
  • [4] date1とdate2が同じ日時情報を持ったオブジェクトかどうかを比較。
  • [5] Calendar を使って2016年1月1日の日時情報を作成し、DateオブジェクトdateGantanに変換。
  • [6] 実行時date1がdateGantanより未来かを判定。
  • [7] 実行時date1がdateGantanより過去かを判定。

まとめ

このページではJavaのDateクラスについてまとめてきた。

徐々の使われにくくなっていくクラスだが、それでも既存コードにはたくさん登場するし、Javaの下位互換性を考えれば使えなくなることもない。

サンプルコードを実際に打って、確認していただければと思う。

]]>
https://eng-entrance.com/java-time-date/feed 0
【Java】日時の計算や取得に使えるCalendarクラスの使い方! https://eng-entrance.com/java-time-calendar https://eng-entrance.com/java-time-calendar#respond Sat, 15 Oct 2016 07:09:19 +0000 http://eng-entrance.com/?p=3042 Javaで日時の計算や、取得、設定をするにはJava.utilパッケージのCalendarクラスを使用する。

このページではCalendarクラスについて詳しくまとめている。参考にしていただければと思う。

下記のページではCalendarクラス以外もまとめているので、こちらもオススメだ。

JavaのCalendarクラス

Calendarクラスには、日時の情報の情報の取得や日付の計算・比較に役立つ様々なメソッドが用意されている。

Calendarオブジェクトの取得

Calendarクラスは抽象クラスなのでnew演算子を用いてオブジェクトを生成することはできないので注意しよう。Calendarクラスのオブジェクトの取得方法はこうだ。

Calendar.getInstance()

戻り値の型

public static Calendar

内容

現在時刻のCalendarオブジェクトを取得する。

以下、Calendarクラスの細かいメソッドやフィールドを一通りまとめているが、とりあえず使い方がみたいという方は、サンプルコードを用意しているので、そこを閲覧してほしい。

主要フィールド

次のようなフィールドが用意されている。MONTHが0〜11なことに注意が必要だ。

YEAR

MONTH

月(0~11)

DATE, DAY_OF_MONTH

現在の月の何日目かを表す。

WEEK_OF_MONTH

現在の月の何週目かを表す。

DAY_OF_WEEK

現在の週の何日目かを表す。

AM_PM

午前午後を表す。(午前0、午後1)

HOUR

午前または午後の何時かを表す。(0~11)

HOUR_OF_DAY

24時制で何時かを表す

MINUTE

何分かを表す。

SECOND

何秒かを表す。

主なメソッド

主なメソッドは次の通りだ。

時間を加算するCalendarオブジェクト.add(int field,int amount))

戻り値の型

void

内容

指定された時間量を指定されたカレンダフィールドに加算または減算する。

【例】現在の時間から 5 日を引く場合

add(Calendar.DAY_OF_MONTH, -5).

引数:

field - カレンダフィールド。

amount - フィールドに追加される日付または時間の量。

フィールドを返すCalendarオブジェクト.get(int field,))

戻り値の型

Public int

内容

指定されたカレンダフィールドの値を返す。

引数:

field - 指定されたカレンダフィールド。

戻り値:

指定されたカレンダフィールドの値。

例外:

指定されたフィールドが範囲外の場合エラー(ArrayIndexOutOfBoundsException )が発生する。

指定された値に設定するCalendarオブジェクト.set(int field,int value)

戻り値の型

void

内容

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

引数:

field - 指定されたカレンダフィールド。

value - 指定されたカレンダフィールドに設定する値。

Calendarオブジェクト.set(int year,int month,iint day)

戻り値の型

void

内容

カレンダフィールド YEAR、MONTH、および DAY_OF_MONTH の値を設定する。ほかのカレンダフィールドの以前の値は保持される。保持されないようにする場合は、最初に clear() を呼び出して値を未定義に設定したあとsetメソッドで値を設定する。

引数:

year - YEAR カレンダフィールドの設定に使用する値。

month - MONTH カレンダフィールドの設定に使用する値。

Month 値は 0 から始まる (1 月は 0 になる)。

date - DAY_OF_MONTH カレンダフィールドの設定に使用する値。

最大値を返すCalendarオブジェクト.getActualMaximum(int field)

戻り値の型

Public int

内容

この Calendar に時間値を指定して、指定のカレンダフィールドが取り得る最大値を返す。

例えば引数field にCalendar.DATEを指定した場合はその月の末尾を返す。

引数:

field - カレンダフィールド

戻り値:

この Calendar の時間値に対する、指定されたカレンダフィールドの最大値

後の日付かを判定するCalendarオブジェクト.after(Calendar when)

戻り値の型

Public boolean

内容

この日付が、指定された日付より後にあるかどうかを判定する。

引数:

when - 日付

戻り値:

Calendar オブジェクトが表す時点が when オブジェクトの表す時点より遅い場合だけ true、そうでない場合は false

前の日付かを判定するCalendarオブジェクト.before(Calendar when)

戻り値の型

Public boolean

内容

この日付が、指定された日付より前にあるかどうかを判定する。

引数:

when - 日付

戻り値:

Calendar オブジェクトが表す時点が when オブジェクトの表す時点より遅い場合だけ true、そうでない場合は false

同じ日付かを判定するCalendarオブジェクト.equals(Object obj)

戻り値の型

Public boolean

内容

2 つの日付が等しいかどうかを比較する。引数が null ではなく、かつ、このオブジェクトとミリ秒まで同じ時点を表す Calendar オブジェクトであれば、true を返す。

引数:

obj - 比較対象のオブジェクト

戻り値:

オブジェクトが同じである場合は true、そうでない場合は false

日付を比較するCalendarオブジェクト.compareTo(Calendar anotherCalendar)

戻り値の型

Public int

内容

順序付けのために 2 つの Calendar を比較する。

引数:

anotherCalendar - 比較対象の Calendar

戻り値:

引数 anotherCalendar がこの Calendar と等しい場合は値 0。この Calendar が引数 anotherCalendar より前の場合は 0 より小さい値。この Calendar が引数 anotherCalendar より後の場合は 0 より大きい値

例外:

・指定された Calendar が null である場合、エラー(NullPointerException )が発生する。

・カレンダ値が無効なため、指定された Calendar オブジェクトの時間値を取得できない場合、エラー(IllegalArgumentException )が発生する。

時間を取得するCalendarオブジェクト.getTime()

戻り値の型

final Date

内容

この Calendar の時間値 (元期からのミリ秒単位のオフセット) を表す Date オブジェクトを返す。

戻り値:

時間値を表す Date。

解釈を設定するCalendarオブジェクト.setLenient(boolean lenient)

戻り値の型

Void

内容

日付/時間の解釈を厳密に行うかどうかを設定する。初期設定では「非厳密」なので、「1996 年 2 月 942 日」のような日付は、1996 年 2 月 1 日から第 941 日目と同じこととみなされて不正な日であってもエラーにはならない。厳密な解釈に設定すると、このような日付の場合、例外が発生してエラーとなる。

引数:

lenient - 非厳密モードがオンの場合は true、そうでない場合は false。

 

Calendarクラスのサンプルコード

それでは実際にいくつかのサンプルコードを見ていこう。

日時情報の取得と設定 サンプルコード

public class CalendarSample1 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);//[1]
        System.out.println(cal.getTime());//[2]
        System.out.println("YEAR: " + cal.get(Calendar.YEAR));//[3]
        System.out.println("MONTH: " + cal.get(Calendar.MONTH));//[4]
        System.out.println("DATE: " + cal.get(Calendar.DATE));//[5]
cal.set(2016,0,1, 0, 0, 0);  
        System.out.println(cal.getTime());//[6]
        cal.set(2016,1,30, 0, 0, 0); 
        System.out.println(cal.getTime());//[7]
    }
}

実行結果

java.util.GregorianCalendar[time=1473010723045,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=2016,MONTH=8,WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=249,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=38,SECOND=43,MILLISECOND=45,ZONE_OFFSET=32400000,DST_OFFSET=0]
Mon Sep 05 02:38:43 JST 2016
YEAR: 2016
MONTH: 8
DATE: 5
Fri Jan 01 00:00:00 JST 2016
Tue Mar 01 00:00:00 JST 2016

サンプルコードの説明

  • [1] Calendarオブジェクトを取得し、表示→ Calendarクラスは抽象クラスなので、実際にはjava.util.GregorianCalendarクラスのオブジェクトが生成されている。また、多くの情報を保持しているのがよくわかるだろう。
  • [2] 取得したCalendarオブジェクトをDate型に変換し、表示。
  • [3] [4] [5] get()メソッドにフィールドYEAR、Calendar. MONTH,Calendar.DATEを引数で渡し、Calendarオブジェクトから必要な情報(年、月、日)を取得しそれぞれ表示。※月は0始まりなので9月の場合は8と表示される。月だけが0~11で表現されているので注意しよう。
  • [6]2016年1月1日となるようにset()メソッドを使用して値をセットし表示。
  • [7]ありえない日時(2016年2月30日)となる日付を設定し表示。エラーにはならずずれた日付を修正して表示。(日付指定が間違っていてもエラーにならないので注意しよう)

日時計算のサンプルコード

2つの日付の差を求めるサンプル

public class CalendarSample2 {
    public static void main(String[] args) {
        Calendar cal1 = Calendar.getInstance();//[1]
        Calendar cal2 = Calendar.getInstance();
        cal2.add(Calendar.MONTH, -7);//[2]
        System.out.println("cal1:" + cal1.get(Calendar.YEAR) + "/" + (cal1.get(Calendar.MONTH) + 1) + "/" + cal1.get(Calendar.DAY_OF_MONTH));
        System.out.println("cal2:" + cal2.get(Calendar.YEAR) + "/" + (cal2.get(Calendar.MONTH) + 1) + "/" + cal2.get(Calendar.DAY_OF_MONTH));
        long diffTime = cal1.getTimeInMillis() - cal2.getTimeInMillis();//[3]
        int diffDayMillis = 1000 * 60 * 60 * 24;//[4]
        int diffDays = (int) (diffTime / diffDayMillis);
         System.out.println("2つの日付の差は:" + diffDays + "日です。");//[5]
    }
}

実行結果

cal1:2016/9/5
cal2:2016/2/5
2つの日付の差は:212日です。

サンプルコードの説明

  • [1] 現在の日時情報を持つCalendarオブジェクトcal1を生成
  • [2] Calendarオブジェクトcal2に現在から7か月前の日時情報を設定。
  • [3] 変数cal1とcal2それぞれのミリ秒数を取得し、その差を求める。
  • [4] 差のミリ秒数を日単位に変換し、2つの日付の差を表示。

日付の整合性サンプルコード

public class CalendarSample3 {
    public static void main(String[] args) {
        //------非厳密(デフォルト)
        Calendar cal1 = Calendar.getInstance();
        cal1.set(2016,12,31);//[1]
        System.out.println("cal1:" + cal1.get(Calendar.YEAR) + "/" + (cal1.get(Calendar.MONTH) + 1) + "/" + cal1.get(Calendar.DAY_OF_MONTH));//[2]
        //------厳密
        Calendar cal2 = Calendar.getInstance();
        cal2.setLenient(false);//[3]
        cal2.set(2016,12,31);
        try {
             System.out.println("cal2:" + cal2.get(Calendar.YEAR) + "/" + (cal2.get(Calendar.MONTH) + 1) + "/" + cal2.get(Calendar.DAY_OF_MONTH));//[4]
        } catch (IllegalArgumentException e) {
            System.out.println("日付が正しくありません");//[5]
        }
    }
}

実行結果

cal1:2017/1/31
日付が正しくありません

サンプルコードの説明

  • [1] 現在の日時情報を持つCalendarオブジェクトcal1を生成し、年→2106、月→12、日→31をセットする。
  • [2]cal1の日付情報を取得し表示する。月は0~11で指定すべきなので本来なら12を設定したらおかしな日付となるが、非厳密な状態では2016年の13か月目と解釈され2017/1/31と表示される。
  • [3] Calendarオブジェクトcal12に厳密モードに設定。
  • [4]cal1と同様に年→2106、月→12、日→31をセットした後、表示させる。
  • [5]get()メソッドを実行した際にエラーが発生(※)し「日付が正しくありません」が表示される。

(※)不正は日付を設定した時には日付のチェックは働かない。値を取得しようとしたときにチェック機能が働くという事に注意しよう。

まとめ

このページではJavaのCalendarクラスについてまとめてきたが、いかがだっただろうか?

日付に関することであれば、Calendarクラスを使えば困ることはほとんどないだろう。積極的に使っていただければと思う。

]]>
https://eng-entrance.com/java-time-calendar/feed 0
【サンプルプログラム付き】Java時間の取得方法まとめ! https://eng-entrance.com/java-get-time https://eng-entrance.com/java-get-time#comments Tue, 28 Jun 2016 07:01:02 +0000 http://eng-entrance.com/?p=1254 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を文字にして戻す。

サンプルプログラム

import java.util.Date;
import java.lang.Thread;

public class Main {
	public static void main(String args[]) throws InterruptedException{

		//Dateオブジェクトを生成する
	    Date dTime = new Date();	//[1]

	    //時間をずらすため1秒中断
	    Thread.sleep(1000);			//[2]
	    
	    //別のDateオブジェクトを生成する
	    Date dTime2 = new Date();	//[3]

	    //Dateの設定内容を出力
	    System.out.println("[4] dTimeを表示 : " + dTime.toString());	
	    System.out.println("[5] dTime2を表示 : " + dTime2.toString());	

	    //指定された日時の前後を比較
	    boolean ret;
	    ret  = dTime2.after(dTime);	
	    System.out.println("[5] dTime2がdTimeより後の日時か比較 : " + ret);

	    ret  = dTime2.before(dTime);	
	    System.out.println("[6] dTime2がdTimeより前の日時か比較 : " + ret);

	    ret = dTime2.equals(dTime);	
	    System.out.println("[7] 同じ日時かどうか : " + ret);

	    //日時の比較
	    int diff = dTime.compareTo(dTime2);	
	    System.out.println("[8] dTimeとdTime2の比較 : " + diff);
	    
	}
}

実行結果

[4] dTimeを表示 : Thu Jun 23 16:16:35 JST 2016
[5] dTime2を表示 : Thu Jun 23 16:16:36 JST 2016
[5] dTime2がdTimeより後の日時か比較 : true
[6] dTime2がdTimeより前の日時か比較 : false
[7] 同じ日時かどうか : false
[8] dTimeとdTime2の比較 : -1

プログラムの説明

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

  • [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()

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

サンプルプログラム

import java.util.Calendar;
import java.util.Date;
import java.lang.Thread;

public class Main {
	public static void main(String args[]) throws InterruptedException{
		
		Calendar cTime = Calendar.getInstance();	//[1]

		//主なCalendarクラスの時間関連メソッド
		//各要素の取得
		System.out.println("[2] 時を表示 : " + cTime.get(Calendar.HOUR));
		System.out.println("[3] 時(24時間)を表示 : " + cTime.get(Calendar.HOUR_OF_DAY));
		System.out.println("[4] 分を表示 : " + cTime.get(Calendar.MINUTE));
		System.out.println("[5] 秒を表示 : " + cTime.get(Calendar.SECOND));
		System.out.println("[6] ミリ秒を表示 : " + cTime.get(Calendar.MILLISECOND));
		System.out.println("[7] AM/PMを表示 : " + cTime.get(Calendar.AM_PM));

		//カレンダー時間の設定
		cTime.set(Calendar.HOUR_OF_DAY, 23);
		cTime.set(Calendar.MINUTE, 59);
		cTime.set(Calendar.SECOND, 59);
		
		Date time = cTime.getTime();
		System.out.println("[8] setで変更した日付を表示(時分秒を指定) : " + time.toString());

		Thread.sleep(1000);

		Calendar cTime2 = Calendar.getInstance();
		Date time2 = cTime2.getTime();
		System.out.println("[9] 新しいカレンダーオブジェクトを生成 : " + time2.toString());
		
		//カレンダーの比較
		boolean ret;
		ret = cTime.equals(cTime2);
		System.out.println("[10] cTimeとcTime2が同じかどうか : " + String.valueOf(ret));
		
		ret  = cTime.after(cTime2);
		System.out.println("[11] cTimeがcTime2より後の時間かどうか : " + String.valueOf(ret));

		ret  = cTime.before(cTime2);
		System.out.println("[12] cTimeがcTime2より前の時間かどうか : " + String.valueOf(ret));

		cTime.add(Calendar.SECOND, 1);
		time = cTime.getTime();
		System.out.println("[13] cTimeに1秒加算 : " + time.toString());

		//値のクリア
		cTime.clear();
		time = cTime.getTime();
		System.out.println("[14] 値をクリアする : " + time.toString());
		
	}
}

実行結果

[2] 時を表示 : 4
[3] 時(24時間)を表示 : 16
[4] 分を表示 : 31
[5] 秒を表示 : 10
[6] ミリ秒を表示 : 188
[7] AM/PMを表示 : 1
[8] setで変更した日付を表示(時分秒を指定) : Thu Jun 23 23:59:59 JST 2016
[9] 新しいカレンダーオブジェクトを生成 : Thu Jun 23 16:31:11 JST 2016
[10] cTimeとcTime2が同じかどうか : false
[11] cTimeがcTime2より後の時間かどうか : true
[12] cTimeがcTime2より前の時間かどうか : false
[13] cTimeに1秒加算 : Fri Jun 24 00:00:00 JST 2016
[14] 値をクリアする : Thu Jan 01 00:00:00 JST 1970

プログラムの説明 

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

  • [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

タイムゾーン

サンプルプログラム

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class Main {
	public static void main(String args[]) {

        //カレンダーを生成
        Calendar cTime = Calendar.getInstance();

        //フォーマットを設定して出力
        SimpleDateFormat sdf = new SimpleDateFormat("[1] h/m/s S");
        System.out.println(sdf.format(cTime.getTime()));

        sdf.applyPattern("[2] a hh時mm分ss秒 SSSミリ秒");
        System.out.println(sdf.format(cTime.getTime()));

        sdf.applyPattern("[3] HH:mm:ss SSS");
        System.out.println(sdf.format(cTime.getTime()));

        sdf.applyPattern("[4] HH:mm:ss Z");
        System.out.println(sdf.format(cTime.getTime()));
        
	}
}

実行結果 

[1] 5/4/48 827
[2] 午後 05時04分48秒 827ミリ秒
[3] 17:04:48 827
[4] 17:04:48 +0900

プログラムの説明 

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

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

Systemクラス(java.lang.System)

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

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

主なメソッド

戻り値の型

メソッド

内容

long

currentTimeMillis()

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

long

nanoTime()

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

サンプルプログラム

public class Main {
	public static void main(String args[]) throws InterruptedException{

		//ミリ秒で計測
		long startMilli = System.currentTimeMillis();

		//空ループを実行
		for(long loopA = 0; loopA < 100000000; loopA++){
		}
		long endMilli = System.currentTimeMillis();
		System.out.println("[1]処理時間 : " + (endMilli - startMilli)  + " ミリ秒");

		//ナノ秒で計測
		long startNano = System.nanoTime();

		//空ループを実行
		for(long loopB = 0; loopB < 100000000;loopB ++){
		}

		long endNano = System.nanoTime();
		System.out.println("[2]処理時間 : " + (endNano - startNano)  + " ナノ秒");

	}
}

実行結果 

[1]処理時間 : 62 ミリ秒
[2]処理時間 : 59179088 ナノ秒

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

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

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

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

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

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

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

]]>
https://eng-entrance.com/java-get-time/feed 1
一覧で確認!Java日付の取得方法と日付クラスまとめ https://eng-entrance.com/java-date https://eng-entrance.com/java-date#respond Thu, 23 Jun 2016 00:47:37 +0000 http://eng-entrance.com/?p=1129 プログラムで扱う事ができるデータ型のうち、日付型のデータを扱う機会は非常に多い。

それはJavaプログラミングにおいても例外ではないが、Javaの場合は日付を扱えるクラスが複数あるので混乱する方も多いだろう。

このページでは、Javaにおける日付の扱い方について、基本的な使い方とクラスごとの詳細について紹介していく。

Javaで今日の日付を取得する

細かいことはいいから、とりあえず今日の日付の出し方を知りたい、という方もいると思う。はじめにJavaで今日の日時を取得する方法だけお伝えしておく。

Javaで現在の日時を取得する方法は次の通りだ。

Dateクラスを使う

import java.util.Date;

public class Main {
    public static void main(String[] args) {

        Date date = new Date();
        System.out.println(date.toString());
    }
}

Calenderクラスを使う

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getTime().toString());
    }
}

それぞれのクラスの詳細は、下に載っているので確認してほしい。

日付に関連するクラスの種類

Javaプログラミングにおいて、日付型を扱うときに使用する代表的なクラスは以下の通りだ。

クラス

内容

java.util.Date

日付を扱うクラス

java.util.Calendar

日付の操作、計算などを扱うクラス

java.text.SimpleDateFormat

日付書式を扱うクラス

 日付を扱うクラスとしては、JDK1.8から新しくjava.timeパッケージがリリースされているが、まずは基本となる上記の3つのクラスについて理解しておこう。java.timeパッケージは別の機会にでも紹介する。 

Dateクラス(java.util.Date)

Dateクラスはjavaの初期から使われているクラスで、単純に日付を取得したいときや簡単に表示したい時などに使うケースが多い。

主なメソッド

戻り値の型

メソッド

内容

boolean

after(Date dt)

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

boolean

before(Date dt)

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

Object

clone()

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

int

compareTo(Date dt)

2つのDate型を比較する。同じ場合は0、引数の日付が前の日付の場合は正の値、引数の日付が後の日付の場合は負の値を返す。

boolean

equals(Object obj)

2つのDateが等しいかどうかを判定する。

String

toString()

Dateを文字列で返す。

サンプルプログラム

import java.util.Date;

public class Main {
	public static void main(String args[]){

	    //Dateオブジェクトを生成する
	    Date dt = new Date();	//[1]

	    //Dateのコピーを生成する
	    Date dt2 = (Date) dt.clone();	//[2]

	    //Dateの設定内容を出力
	    System.out.println("[3] dtを表示 : " + dt.toString());	
	    System.out.println("[4] dt2を表示 : " + dt2.toString());	

	    //指定された日付の前後を比較
	    boolean ret;
	    ret  = dt2.after(dt);	
	    System.out.println("[5] dt2はdtより後の日時かどうか : " + ret);

	    ret  = dt2.before(dt);	
	    System.out.println("[6] dt2はdtより前の日時かどうか : " + ret);

	    ret = dt2.equals(dt);	
	    System.out.println("[7] dt2はdtと同じ日時かどうか : " + ret);

	    //日付の比較
	    int i = dt.compareTo(dt2);	
	    System.out.println("[8] dtとdt2の比較 : " + i);
	    
	}
}

実行結果

[3] dtを表示 : Thu Jun 16 15:46:14 JST 2016
[4] dt2を表示 : Thu Jun 16 15:46:14 JST 2016
[5] dt2はdtより後の日時かどうか : false
[6] dt2はdtより前の日時かどうか : false
[7] dt2はdtと同じ日時かどうか : true
[8] dtとdt2の比較 : 0

プログラムの説明

それでは簡単に説明してみよう。[]で囲んだ番号はサンプルプログラムの位置を意味するので、プログラムや実行結果を見る時に役立ててほしい。

  • [1]Dateオブジェクトを新しく生成している。この時点では生成した日付が設定される。
  • [2]新しいDateオブジェクトをコピーしている。
  • [3]dtを文字列で表示している。Dateオブジェクトは海外のフォーマットで表示されるので、日本人にはなじみにくいかもしれない。
  • [4]dtをコピーしたdt2を表示している。コピーしているので値は同じとなる。
  • [5]dtとdt2をafter()で比較している。同じ値なので「false」が返る。
  • [6]dtとdt2をbefore()で比較している。同じ値なので「false」が返る。
  • [7]dtとdt2をequals()で比較している。同じ値なので「true」が返る。
  • [8]dtとdt2の日付の差を比較している。同じ値なので「0」となる。

Dateクラスで注意すること

このクラスを注意しておきたいのは、非推奨のメソッドが多いという点だ。

非推奨のメソッドというのは、Dateオブジェクトが生まれた当時は使われていたが、javaの改変につれて使われなくなり、別クラスのメソッドに置き換わった機能のことを意味している。今でも非推奨のメソッドを使う事ができるが、非推奨のメソッドを使うことはあまりオススメしない。今後、javaの改変が進むにつれて、非推奨のメソッドが使えなくなる可能性もあるからだ。

サンプルでは同じ日付のDateオブジェクトばかり比較しているのがわかる。本来なら別の日付を比較したいところだが、Dateクラスで日付を操作するメソッドは非推奨なのであえて使用していない。非推奨のメソッドはDateだけでなく他にもあるので、新しいクラスを操作する場合はjavadocを見てチェックするようにしてほしい。 

Calendarクラス(java.util.Calendar)

CalendarクラスはDateクラスよりも豊富な機能を持っており、文字通りカレンダーを見るように日付の計算や参照ができるクラスだ。

主なメソッド

戻り値の型

メソッド

内容

Calendar

getInstance()

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

int

get(int fld)

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

void

set(int fld, int val)

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

void

set(int year, int month, int day)

年、月、日を設定する。

boolean

equals(Object obj)

2つのCalendarが等しいかどうかを判定する。

void

add(int fld, int val)

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

boolean

after(Object obj)

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

boolean

before(Object obj)

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

void

clear()

Calendarオブジェクトをクリアする。

void

setLenient(boolean lenient)

日付の解釈を厳密に行うかどうかを設定する。

サンプルプログラム

import java.util.Calendar;

public class Main {
	public static void main(String args[]){
		
		Calendar cal = Calendar.getInstance();	//[1]

		//主なCalendarメソッド
		//各種形式の取得
		System.out.println("[2] 年を表示 : " + cal.get(Calendar.YEAR));
		System.out.println("[3] 月を表示 : " + cal.get(Calendar.MONTH));
		System.out.println("[4] 日付を表示 : " + cal.get(Calendar.DATE));
		System.out.println("[5] 紀元前後を表示 : " + cal.get(Calendar.ERA));
		System.out.println("[6] 現在の年の何日目かを表示 : " + cal.get(Calendar.DAY_OF_YEAR));
		System.out.println("[7] 現在の月の何日目かを表示 : " + cal.get(Calendar.DAY_OF_MONTH));
		System.out.println("[8] 曜日を表示 : " + cal.get(Calendar.DAY_OF_WEEK));
		System.out.println("[9] 現在の月の何度目の曜日かを表示 : " + cal.get(Calendar.DAY_OF_WEEK_IN_MONTH));
		System.out.println("[10] 現在の年の何週目かを表示 : " + cal.get(Calendar.WEEK_OF_YEAR));
		System.out.println("[11] 現在の月の何週目かを表示 : " + cal.get(Calendar.WEEK_OF_MONTH));
		
		System.out.println("[12] 年を表示(定数を使わない) : " + cal.get(1));

		//カレンダーの設定
		cal.set(Calendar.YEAR, 2017);
		System.out.println("[13] setで変更した日付を表示(年だけ指定) : " + getCalString(cal));

		cal.set(2016, 1, 1);
		System.out.println("[14] setで変更した日付を表示(年月日指定) : " + getCalString(cal));

		Calendar cal2 = Calendar.getInstance();
		System.out.println("[15] 新しいカレンダーオブジェクトを生成 : " + getCalString(cal2));
		
		//カレンダーの比較
		boolean ret;
		ret = cal.equals(cal2);
		System.out.println("[16] calとcal2が同じかどうか : " + String.valueOf(ret));
		
		ret  = cal.after(cal2);
		System.out.println("[17] calがcal2より後の日付かどうか : " + String.valueOf(ret));

		ret  = cal.before(cal2);
		System.out.println("[18] calがcal2より前の日付かどうか : " + String.valueOf(ret));

		cal.add(Calendar.MONTH, 1);
		System.out.println("[19] calにひと月加算 : " + getCalString(cal));

		//厳密な解釈を行い、ありえない日(2016年2月32日)を設定
		cal.setLenient(true);
		cal.set(2016,1,32); 
		System.out.println("[20] 厳密な解釈をして、ありえない日を設定 : " +  getCalString(cal));

		//厳密な解釈を行わずに、ありえない日(2016年2月32日)を設定
		cal.setLenient(false);
		cal.set(2016,1,32);
		try{
			System.out.println("[21] 厳密な解釈をせずに、ありえない日を設定 : " + getCalString(cal));
		}catch(Exception ex){
			System.out.println("[21] 厳密な解釈をせずに、ありえない日を設定 するとエラーになる");
		}

		//値のクリア
		cal.clear();
		System.out.println("[22] 値をクリアする : " +  getCalString(cal));
		
	}
	//カレンダーを年月日の文字列で取得
	private static String  getCalString(Calendar tmpCal){

		return String.valueOf(tmpCal.get(Calendar.YEAR)) + "/" + String.valueOf(tmpCal.get(Calendar.MONTH)) + "/" + String.valueOf(tmpCal.get(Calendar.DATE));
		
	}
}

実行結果

[2] 年を表示 : 2016
[3] 月を表示 : 5
[4] 日付を表示 : 16
[5] 紀元前後を表示 : 1
[6] 現在の年の何日目かを表示 : 168
[7] 現在の月の何日目かを表示 : 16
[8] 曜日を表示 : 5
[9] 現在の月の何度目の曜日かを表示 : 3
[10] 現在の年の何週目かを表示 : 25
[11] 現在の月の何週目かを表示 : 3
[12] 年を表示(定数を使わない) : 2016
[13] setで変更した日付を表示(年だけ指定) : 2017/5/16
[14] setで変更した日付を表示(年月日指定) : 2016/1/1
[15] 新しいカレンダーオブジェクトを生成 : 2016/5/16
[16] calとcal2が同じかどうか : false
[17] calがcal2より後の日付かどうか : false
[18] calがcal2より前の日付かどうか : true
[19] calにひと月加算 : 2016/2/1
[20] 厳密な解釈をして、ありえない日を設定 : 2016/2/3
[21] 厳密な解釈をせずに、ありえない日を設定 するとエラーになる
[22] 値をクリアする : 1970/0/1

プログラムの説明

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

  • [1]カレンダーオブジェクトを生成する。生成するにはgetInstance()を使用する。
  • [2]カレンダーの「年」を表示する。
  • [3]カレンダーの「月」を表示する。月はは定数で表される。
  • [4]カレンダーの「日」を表示する。
  • [5]紀元前、紀元後を表示する。紀元前の場合は0、紀元後の場合は1が表示される。
  • [6]日付がその年の最初から何日目かを表示する。
  • [7]日付がその月の最初から何日目かを表示する。
  • [8]曜日を表示する。曜日は定数で表される。
  • [9]その月の何度目の曜日かを表示する。
  • [10]日付がその年の最初の週から何週目かを表示する。
  • [11]日付がその月の最初の週から何週目かを表示する。
  • [12]年を表示する。YEARなどの定数を使わなくても、数値が分かれば同じ結果となる。
  • [13]set()メソッドでは特定のカレンダーフィールドだけ指定して値の設定ができる。
  • [14]年月日全てを指定して値の設定も可能だ。
  • [15]別のカレンダーオブジェクトを生成。
  • [16]calとcal2をequals()で比較している。異なる値なので「false」が返る。
  • [17]calとcal2をafter()で比較している。cal2の方が後の日付なので「false」が返る。
  • [18]calとcal2をbefore()で比較している。cal2の方が後の日付なので「true」が返る。
  • [19]add()メソッドを使って年を加算する。
  • [20]厳密な解釈をする設定をして、ありえない日を設定する。この場合は2016/1/32を設定しており、2月の最大日数である29日より3日余分だが、余分となった日付も正しく加算してくれている。
  • [21]厳密な解釈をしない設定の場合、ありえない日を設定した場合はエラーとなる。try~catchでエラートラップをしているが、この場合はエラーが発生したのでcatch句の文字を出力している。
  • [22]カレンダーをクリアする。クリアするとデフォルトの日付が設定される。

Calendarクラスの定数について

Calendarクラスでは定数を指定してのメソッド実行や、実行結果の戻り値が定数となるケースがある。定数とは意味がある文字列で数値などの値を示したものだ。0や1だと何を意味するのかがわかりにくいが、YEARやMONTHだと「年」「月」というように、プログラマーが内容を理解しやすいように定められている。

このプログラムの例では、get()メソッドで使用するCalendar定数、[3]のステップの月、[8]のステップの曜日などが定数となっているが、これらの定数は以下のとおりだ。

Calendar定数

定数

ERA

0

YEAR

1

MONTH

2

WEEK_OF_YEAR

3

WEEK_OF_MONTH

4

DATE

5

DAY_OF_MONTH

5

DAY_OF_YEAR

6

DAY_OF_WEEK

7

月の定数

定数

JANUARY

0

FEBRUARY

1

MARCH

2

APRIL

3

MAY

4

JUNE

5

JULY

6

AUGUST

7

SEPTEMBER

8

OCTOBER

9

NOVEMBER

10

DECEMBER

11

UNDECIMBER

12

曜日定数

定数

SUNDAY

1

MONDAY

2

TUESDAY

3

WEDNESDAY

4

THURSDAY

5

FRIDAY

6

SATURDAY

7

定数は直接値を指定することもできる。サンプルプログラムの[12]では値を直接指定しているが、読みづらいソースになるので定数を使う様にしたほうがいい。また、これらの定数のうち、月の定数については注意が必要だ。Calendarオブジェクトの月は1月が「0」となっているため、1月だから「1」を設定すると実際には2月を設定してしまうことになるので気を付けよう。

なお、月の定数には「UNDECIMBER」という定数があるが、これは太陰暦で使用する定数であるため、一般的にはあまり使用することはないだろう。

SimpleDateFormatクラス(java.text.SimpleDateFormat)

SimpleDateFormatクラスは日付書式を簡単に設定できるクラスだ。先ほどののCalendarクラスのサンプルプログラムを見てほしい。

プログラムの「getCalString()」というクラスで年月日をそれぞれ抽出して文字列変換しているが、そのような手間をかけなくてもSimpleDateFormatクラスを使うことで簡単に表示することができる。

主なコンストラクタ

コンストラクタ

内容

SimpleDateFormat()

デフォルトの書式で日付パターンが設定される。

SimpleDateFormat(String patern)

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

主なメソッド

戻り値の型

メソッド

内容

void

applyPattern(String pattern)

指定された日付書式を適用する。

StringBuffer

format(Date dt)

指定された日付書式を適用して文字列(StringBuffer)で表示する。

日付書式について

SimpleDateFormatでは日付書式を指定して値を取得することができる。日付書式には次の種類があるので、目を通してもらいたい。

書式

内容

G

紀元

y

M

w

年における週

W

月における週

D

年における日

d

月における日

F

月における曜日

E

曜日

サンプルプログラム

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class Main {
	public static void main(String args[]) {

        //カレンダーを生成
        Calendar cal = Calendar.getInstance();

        //フォーマットを設定して出力
        SimpleDateFormat sdf = new SimpleDateFormat("[1] y/M/d");
        System.out.println(sdf.format(cal.getTime()));

        //フォーマットを変更
        sdf.applyPattern("[2] yyyy/MM/dd");
        System.out.println(sdf.format(cal.getTime()));

        sdf.applyPattern("[3] yyyy/MM/dd (E)");
        System.out.println(sdf.format(cal.getTime()));
	
        sdf.applyPattern("[4] G yyyy年MM月dd日");
        System.out.println(sdf.format(cal.getTime()));

        sdf.applyPattern("[5] yyyy年MM月dd日 は今年w週目");
        System.out.println(sdf.format(cal.getTime()));

        sdf.applyPattern("[6] yyyy年MM月dd日 は今月W週目");
        System.out.println(sdf.format(cal.getTime()));

        sdf.applyPattern("[7] yyyy年MM月dd日 は今年D日目");
        System.out.println(sdf.format(cal.getTime()));

        sdf.applyPattern("[8] yyyy年MM月dd日 E曜日はF回目のE曜日");
        System.out.println(sdf.format(cal.getTime()));
	
	}
}

実行結果

[1] 2016/6/16
[2] 2016/06/16
[3] 2016/06/16 (木)
[4] 西暦 2016年06月16日
[5] 2016年06月16日 は今年25週目
[6] 2016年06月16日 は今月3週目
[7] 2016年06月16日 は今年168日目
[8] 2016年06月16日 木曜日は3回目の木曜日

プログラムの説明

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

  • [1]コンストラクタで書式を指定してSimpleDateFormatを生成する。
  • [2]年月日の書式を設定する。「MM」とすることで「6月」を「06」月と0埋めして表示できる。
  • [3]書式で曜日を設定する。
  • [4]紀元を表示する。
  • [5]今年に入って何週目かを表示する。
  • [6]今月に入って何週目かを表示する。
  • [7]今年に入って何日目かを表示する。
  • [8]今月に入って、該当する曜日が何回目かを表示している。

日付の基本をおさえておこう

javaの基本的な日付に関するクラスを紹介したが、いかがだったろうか?

このページを確認してもらえれば、日付に関して必要なところはほとんど押さえられるはずだ。Javaプログラミングにおいて、日付はどのようなシステムでも扱うことなので、基本的なことはしっかりとおさえておくようにしよう。

]]>
https://eng-entrance.com/java-date/feed 0