【Java】日付時間操作を行う

本稿では日付時間の操作に関連した内容を記事にします。

ゲームでセーブファイル内に日付を埋め込みたい時などに使えるでしょう。

ゲームだけではなく一般業務でも必ずといっていいほど使用する分野なので最低限のことは出来るほうが良いのは言うまでもありません。

日付関連のクラス

日付時間には旧APIと新APIがあります。(※この記事では新APIを中心にサンプルコードを載せます。)

旧クラスには下記のようなものがあります。

Date

Date型は現在の日付時間を表すオブジェクトです。インスタンス化すると現在の日付時間を表すオブジェクトが作成されます。

旧クラスとは言っても企業のシステムは現在でも現役で使われているところが多いでしょう。

getTimeメソッドを利用するとオブジェクトが示す日付時間をミリ秒にして取得できます。

SimpleDateFormat

このクラスでは、日付を表すデータから文字列の日付時間に変換したり、逆に文字列からDate型に変換することができます。

現役でもよく使用されるクラスなので文字列からミリ秒、ミリ秒から文字列へ変換するサンプルを載せておきます。

文字列の日付からミリ秒へ変換
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
	public static void main(String[] args) {
		//日付時間パターンを定義
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

		 try {
			//文字列を日付型に変換
			Date date = sdf.parse("1999/11/21 12:21:45.987");

			//ミリ秒に変換
			long millis = date.getTime();

			//1999/11/21 12:21:45.987のミリ秒を表示
			System.out.println(millis);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}
実行結果

943154505987

ミリ秒から文字列へ変換
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
	public static void main(String[] args) {
		//日付時間パターンを定義
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

		//現在時刻のミリ秒を取得
		long millis = new Date().getTime();

		//現在時刻の文字列をyyyy/MM/dd HH:mm:ss.SSS形式で取得
		String datetimeText = sdf.format(millis);

		//現在時刻の文字列を表示
		System.out.println(datetimeText);
	}
}
実行結果

2018/08/31 21:01:57.529

Calendar

Date型と同じく特定の日付時間を表すクラスですが、Date型よりもより細かい機能を利用できます。

例えば、現在の日付から数十分すすめたり、1月前の状態に戻したりできます。

また、曜日の取得なども出来るようになっています。

詳しくは公式APIをどうぞ。


Java1.8以降では新APIのほうを使用することをお勧めします。

新APIには主に下記のようなものがあります。

LocalDate

日付を表すオブジェクトです。

LocalTime

時間を表すオブジェクトです。

LocalDateTime

日付時間を表すオブジェクトであり、一日前や、一週間後の日付時間に移動させたりできます。

また、曜日の取得なども可能となっています。

ZonedDateTime

タイムゾーンを考慮した日付時間オブジェクトです。基本的にLocalDateTimeと同じようなことができるメソッドは用意されている模様

DateTimeFormatter

日付時間の書式を保持します。

Stringが表す日付とLocalDateTimeとの相互変換をするときに利用します。

現在のミリ秒を取得する

現在日時のミリ秒を取得する方法は何パターンかあるのですが、私は下記の方法を使用することがほとんどです。

他のパターンでのミリ秒取得は、このメソッドを元にしていることが多いです。

public class Test {
	public static void main(String[] args) {
		//現在時刻のミリ秒を取得
		long time = System.currentTimeMillis();

		//結果を表示
		System.out.println(time);
	}
}
実行結果

1535890131902

現在の日付時間オブジェクトを取得する

LocalDateTimeクラスのnowメソッドで取得できます。タイムゾーンを考慮したい場合はZonedDateTimeを使用します。

import java.time.LocalDateTime;
import java.time.ZonedDateTime;

public class Test {
	public static void main(String[] args) {
		//現在時刻を取得
		LocalDateTime time = LocalDateTime.now();
		ZonedDateTime zonedTime = ZonedDateTime.now();

		//結果を表示
		System.out.println(time);
		System.out.println(zonedTime);
	}
}
実行結果

2018-09-02T21:12:29.588835600
2018-09-02T21:12:29.590835800+09:00[Asia/Tokyo]

年月日時分秒を指定して日付時間オブジェクトを取得する

年月日時分秒を指定する場合はofメソッドを使用します。

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Test {
	public static void main(String[] args) {
		//2000/11/11 11:11:11取得
		LocalDateTime ldt = LocalDateTime.of(2000,11,11,11,11,11);

		//結果を表示
		System.out.println(ldt);
	}
}
実行結果

2000-11-11T11:11:11

日付時間文字列から日付時間オブジェクトに変換する

DateTimeFormatter.ofPatternを使用して変換対象の書式を指定します。
y=年
M=月
d=日
H=時
m=分
s=秒
S=ミリ秒
となります。
これらを組み合わせてフォーマットを指定しましょう。ちなみにこれ以外のフォーマットもたくさんあります。詳しくはこちらをどうぞ。

変換処理はparseメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {
	public static void main(String[] args) {
		//日付時刻パターンの生成
		DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");

		//パターンにあった文字列からLocalDateTimeオブジェクトの取得
		LocalDateTime datetime = LocalDateTime.parse("2018/05/20 09:45:11.342", fmt);

		//日付時間を表示
		System.out.println(datetime);
	}
}
実行結果

2018-05-20T09:45:11.342

日付時間オブジェクトから日付時間文字列に変換する

書式指定は日付時間文字列から日付時間オブジェクトへ変換する時と同じです。

変換にはformatメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {
	public static void main(String[] args) {
		//日付時刻パターンの生成
		DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");

		//現在時刻をパターンの文字列に変換
		String datetimeText = LocalDateTime.now().format(fmt);

		//日付時間を表示
		System.out.println(datetimeText);
	}
}
実行結果

2018/09/02 21:37:32.848

年を取得する

getYearメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		int r = datetime.getYear();

		//結果を表示
		System.out.println(r);
	}
}
実行結果

2010

月を取得する

getMonthメソッドを使用します。ちなみにenum型でなく直で数値を取得するgetMonthValueも存在します。

import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		Month r = datetime.getMonth();

		//結果を表示
		System.out.println(r.getValue());
	}
}
実行結果

10

日を取得する

getDayOfMonthメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		int r = datetime.getDayOfMonth();

		//結果を表示
		System.out.println(r);
	}
}
実行結果

20

時を取得する

getHourメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		int r = datetime.getHour();

		//結果を表示
		System.out.println(r);
	}
}
実行結果

5

分を取得する

getMinuteメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		int r = datetime.getMinute();

		//結果を表示
		System.out.println(r);
	}
}
実行結果

42

秒を取得する

getSecondメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		int r = datetime.getSecond();

		//結果を表示
		System.out.println(r);
	}
}
実行結果

31

指定日より後であるか判定する

isAfterメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		//2000/11/11 11:11:11より後の日時か
		boolean isAfter = datetime.isAfter(LocalDateTime.of(2000,11,11,11,11,11));

		//結果を表示
		System.out.println(isAfter);
	}
}
実行結果

true

指定日より前であるか判定する

isBeforeメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		//2000/11/11 11:11:11より前の日時か
		boolean isBefore = datetime.isBefore(LocalDateTime.of(2000,11,11,11,11,11));

		//結果を表示
		System.out.println(isBefore);
	}
}
実行結果

false

指定日の数日後を取得する

plusDaysメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		//10日後を取得
		LocalDateTime dateAdd10 = datetime.plusDays(10);

		//結果を表示
		System.out.println(dateAdd10);
	}
}
実行結果

2010-10-30T05:42:31

指定日の数日前を取得する

minusDaysメソッドを使用します。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

		//特定の日時を取得
		LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

		//15日前を取得
		LocalDateTime dateSub15 = datetime.minusDays(15);

		//結果を表示
		System.out.println(dateSub15);
	}
}
実行結果

2010-10-05T05:42:31

うるう年かどうか判定する

isLeapYearメソッドを使用します。

import java.time.LocalDateTime;

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

		//現在日時を取得
		LocalDateTime datetime = LocalDateTime.now();

		//今年はうるう年か
		boolean isLeapYear = datetime.toLocalDate().isLeapYear();

		//結果を表示
		System.out.println(isLeapYear);
	}
}
実行結果

false

指定の日付は何日後かを取得する

おまけで、指定の日付は何日後かを取得するサンプルを作ってみました。

今回の例では12月25日。つまり、クリスマスまで、あと何日なのかを計算するものとなります。

import java.time.LocalDate;
import java.time.temporal.ChronoField;

public class Test {
	public static void main(String[] args) {
		
		//現在でインスタンス生成
		LocalDate now = LocalDate.now();
		
		//年月日からインスタンス生成
		LocalDate nextXmas = LocalDate.of(now.getYear(), 12, 25);
		
		//現在年でクリスマスを過ぎてるなら1年進める
		if ( now.isAfter(nextXmas) ) {
			//1年加算
			nextXmas = nextXmas.plusYears(1L);
		}
		
		//日の差を取得
		long result = nextXmas.getLong(ChronoField.EPOCH_DAY) - now.getLong(ChronoField.EPOCH_DAY);
		
		//結果を表示
		if ( result == 0 ) {
			System.out.println("今日がクリスマスです。");
		} else {
			System.out.println("次のクリスマスは"+result+"日後です。");
		}
	}
}
実行結果

次のクリスマスは112日後です。

ここで使用したgetLongメソッドは引数のenum型に合わせて取得するデータを変更できます。enum定数値はChronoFieldで主に用意されています。詳細はこちらからどうぞ。

Java

Posted by nompor