天天看點

Java8的日期新接口LocalDate

Java8裡,把日期和時間類進行了優化:

LocalDate / LocalDateTime 的功能幾乎是java.util.Date + java.sql.Date + java.util.Calendar + SimpleDateFormate之和:

這兩個包在java.time下,所有的日期或時間都在這個包裡搞定,是時候仍掉老一套日期了,原來每個項目都少不了DateUtil,也可以仍掉了。

不說了,直接貼代碼。

不管是日期初始化、格式化、還是日期加減,都灰常簡潔,

父親節這樣複雜的日期也一行代碼搞定:

LocalDate 目前日期 = LocalDate.now();
		LocalDate 分年月日分别指定日期 = LocalDate.of(2018, 07, 01);// 所見即所得,2018-07-01,可以與Calendar類對比
		Calendar cal = Calendar.getInstance();
		cal.set(2018, 07, 01); // 注意:通過Calendar建立的日期,月份是要從零開始的,是以這個是2018年8月1日,不是7月1日
		LocalDate 預設iso方式的日期 = LocalDate.parse("2018-07-01"); // 按照ISO 8601 yyyy-MM-dd格式驗證,02不能寫成2
		LocalDate 沒有中劃線的日期 = LocalDate.parse("20180701", DateTimeFormatter.BASIC_ISO_DATE);
		LocalDate 斜杠方式的日期 = LocalDate.parse("2018/07/03", DateTimeFormatter.ofPattern("yyyy/MM/dd")); // 自定義格式
		LocalDate 某年某月某日 = LocalDate.parse("2018年07月31日", DateTimeFormatter.ofPattern("yyyy年MM月dd日")); // 自定義格式
		LocalDate 擷取20天之後的日期 = LocalDate.now().plusDays(20);
		LocalDate 擷取1個月後的日期 = LocalDate.now().plusMonths(1);
		LocalDate 擷取1周前的日期 = LocalDate.now().minusWeeks(1);
		LocalDate 擷取2017年5月12日之後一年的日期 = LocalDate.parse("2017-05-12").plusYears(1);

		// 6月的第3個周日是父親節,擷取父親節日期:先定位到今年的6月第1天,再把日期調整到第一個星期日,再加兩周
		LocalDate 今年的父親節日期 = LocalDate.of(LocalDate.now().getYear(), Month.JUNE, 1)
				.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)).plusWeeks(2);

		// 生日
		LocalDate date = LocalDate.of(1949, 10, 01);
		MonthDay 生日 = MonthDay.of(date.getMonth(), date.getDayOfMonth()); // MonthDay隻存儲了月日,天然适合節日、生日的判斷
		MonthDay 目前月日 = MonthDay.from(LocalDate.now());
		if (目前月日.equals(生日)) {
			System.out.println("今天是你的生日啦");
		} else {
			System.out.println("今天不是你的生日");
		}


		LocalDate after30Days = LocalDate.now().plusDays(30); // 目前日期的30天之後,如目前時間:2018-07-17,則輸出值為2018-08-16
		LocalDate afterOneMonth = LocalDate.now().plusMonths(1); // 目前日期的1個月後,如目前時間:2018-07-17,2018-08-17
		LocalDate afterOneMonth2 = LocalDate.of(2018, 01, 30).plusMonths(1); // 2018-01-29之後的30天
		LocalDate beforeOneWeek = LocalDate.now().plusWeeks(1); // 一個星期後
		LocalDate nextMontFirstDay = LocalDate.now().plusMonths(-1).withDayOfMonth(1); // 上個月的第一天 ,屯minusMonths(1)相同
		LocalDate 下個月的最後一天 = LocalDate.now().plusMonths(1).withDayOfMonth(Month.AUGUST.maxLength());