Java 8でうるう年の判定方法

Java 8: The Fundamentals (English Edition)』を読みながら気に入ったところを自分で動かしながら確認しているコードです。

公式ドキュメント:Year class

package io.stream.datetime;

import java.time.Month;
import java.time.MonthDay;
import java.time.Year;

public class YearMonth {

	public static void main(String[] args) {
		Year y = Year.now();
		print(y);//2018
                //Leap Year = うるうどし
		print(y.isLeap());//false
		print(y.isBefore(Year.of(2013)));//false
		print(y.isAfter(Year.parse("2013")));//true
		
		MonthDay md = MonthDay.of(Month.FEBRUARY, 29);
		print(md.atYear(2011));//2011-02-28
		print(md.isValidYear(2012));//true
		print(md.isValidYear(2013));//false
		
	}
	
	private static void print(Object obj){
		System.out.println(obj);
	}

}

Java8ではLocalDateTime APIだけではなく、YearやMonthも提供も提供されており、うるう年を上記のように判定することができます。

                print(y.length());//365
		print(Year.of(2012).length());//366

Year APIにはlength()メソッドもあるので、指定した年に何日含まれているのか判定することも可能。

//The units YEARS, DECADES, CENTURIES, MILLENNIA and ERAS are supported. 
//Other ChronoUnit values will throw an exception. 
Year ny = Year.of(2020);
long amount = y.until(ny, ChronoUnit.YEARS);
print(amount);//2
		
Year fy = Year.of(2030);
long amount2nd = y.until(fy, ChronoUnit.DECADES);
print(amount2nd);//1
		
try {
	long weekAmount = y.until(ny, ChronoUnit.WEEKS);
	print(weekAmount);
} catch (Exception e) {
	System.out.println(e);
	//java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Weeks
}

さらにuntilメソッドを使うと、年、10年、100年、1000年、10万年単位での期間の取得が可能です。
こちらはChronoUnitのその他の値はサポートしていないので、「UnsupportedTemporalTypeException」がスローされます。
正直ERAS(10万年)単位なんて使うのかなと思うのですが、用意されているだけで夢があって面白い。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です