《Java核心技术 卷II》本地日期
本地日期
从绝对时间转向人类时间,JavaAPI中两类人类时间。
本地日期/时间:包含当天的日期和时间,与时区信息没有任何关联,并不对应精准的时刻。1903年6月14日。
时区日期/时间:包括时区,表示时间线上的一个精确的时刻。1969年7月16日 09:32:00 EDT(阿波罗11号发射的时刻)。
API设计者推荐程序员不要使用时区时间,除非想要表示绝对时间的实例。
生日,假期,计划时间通常做好表示为本地日期时间。
LocalDate是带有年、月、日的日期
构建LocalDate对象,可以使用now和of静态方法
LocalDate today = LocalDate.now();//今天的日期
LocalDate alonzosBirthday = LocalDate.of(1903,6,14);
alonzosBirthday = LocalDate.of(1903,Month.JUNE,14);//用月份的枚举
程序员日是每年的第256天
LocalDate programmersDay = LocalDate.of(2014,1,1).plusDays(255);
两个Instant之间的时长是Duration,而用于本地日期的等价物是Period,表示流逝的年,月,日的数量。
birthday.plus(Period.ofYears(1))来获取下一年的生日。
可以直接调用birthday.plusYears(1)。
警告:LocalDate API中的有些方法可能会创建出并不存在的日期。
例如:1月31日加上1个月不应该产生2月31日,不会抛出异常,而会返回该月有效的最后一天。
LocalDate.of(2016,1,31).plusMonths(1)
LocalDate.of(2016,3,31).minusMonths(1)
//都将产生2016年2月29日
getDayOfWeek会产生星期日期,即DayOfWeek枚举的某个值。
DayOfWeek.MONDAY的枚举值是1.
DayOfWeek.SUNDAY的枚举值是7.
注释:周末实际上在每周的末尾,这与Calendar有所差异,后者星期日为1,星期六为7.
Java9添加了两个有用的datesUntil方法,会产生LocalDate对象流。
LocalDate start = LocalDate.of(2000,1,1);
LocalDate endExclusive = LocalDate.now();
Stream<LocalDate> allDays = start.datesUntil(endExclusive);
Stream<LocalDate> firstDaysInMonth = start.datesUntil(endExclusive,Period.ofMonths(1));
除了LocalDate之外,还有MonthDay、YearMonth、Year类可以描述部分日期。
例如,12月25日没有指定年份,可以表示成一个MonthDay对象。
使用LocalDate类
package 第6章时间API.localdates;
import java.lang.reflect.AccessFlag.Location;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.stream.Stream;
public class Localdates {
public static void main(String[] args) {
// 今天的日期
LocalDate today = LocalDate.now();
System.out.println("今天: " + today);
LocalDate alonzosBirthday = LocalDate.of(1903, 6, 14);
alonzosBirthday = LocalDate.of(1903, Month.JUNE, 14);
System.out.println("阿隆佐.丘齐的生日: " + alonzosBirthday);
LocalDate programmersDay = LocalDate.of(2018, 1, 1).plusDays(255);
// 闰年会多一天
System.out.println("程序员日: " + programmersDay);
// 国庆节
LocalDate nationalDay = LocalDate.of(2024, Month.OCTOBER, 1);
// 春节
LocalDate springFestival = LocalDate.of(2025, Month.JANUARY, 29);
System.out.println("国庆到春节还有: " + nationalDay.until(springFestival));
System.out.println("国庆到春节还有: " + nationalDay.until(springFestival, ChronoUnit.DAYS));
// 整月加减,若不存在,默认最后一天。
System.out.println(LocalDate.of(2024, 1, 31).plusMonths(1));
System.out.println(LocalDate.of(2024, 3, 31).minusMonths(1));
// 获取某天是星期几
DayOfWeek gcl = LocalDate.of(1990, 12, 20).getDayOfWeek();
System.out.println("郜子的生日当天是星期几: " + gcl);
System.out.println(gcl.getValue());
System.out.println(DayOfWeek.SATURDAY.plus(3));
// 每月第一天列表
LocalDate start = LocalDate.of(2000, 1, 1);
LocalDate endExclusive = LocalDate.now();
Stream<LocalDate> firstDaysInMonth = start.datesUntil(endExclusive, Period.ofMonths(1));
System.out.println("每月第一天: " + firstDaysInMonth.toList());
// 每月最后一天列表
LocalDate start2 = LocalDate.of(2000, 1, 31);
LocalDate endExclusive2 = LocalDate.now();
Stream<LocalDate> lastDaysInMonth = start2.datesUntil(endExclusive2, Period.ofMonths(1));
System.out.println("每月最后一天: " + lastDaysInMonth.toList());
}
}
若项目中需要,直接查API。