时间不仅是人类生活的基本概念,在编程中同样重要。当然,Java 也为处理时间相关的内容提供了一些工具。我们先从时间单位中的“天”(或者说日期)开始讲起。
LocalDate 类表示一个单一日期,格式是 YYYY-MM-dd
,例如 2017-11-25
或 2025-01-23
。它可以用来保存任何日期:从你的生日到世界末日那天。
这个类属于 java.time
包。
创建 LocalDate 实例和获取当前日期
导入类之后,可以通过下面的代码创建一个存储当前日期的实例:
LocalDate now = LocalDate.now();
当然,也可以创建表示某年某一天的具体日期的实例。LocalDate 提供了两个静态方法 of
和 parse
来完成:
LocalDate date1 = LocalDate.of(2017, 11, 25); // 2017-11-25(2017年11月25日)
LocalDate date2 = LocalDate.parse("2017-11-25"); // 2017-11-25(2017年11月25日)
月份的编号是从 1 到 12,且一个月中的第一天编号为 1,非常直观。
另一个有用的方式是通过指定年份和该年中的第几天来创建日期:
LocalDate.ofYearDay(2017, 33); // 2017-02-02(2017年2月2日)
第几天是一个 int
类型的数字,范围从 1 到 365(平年)或 366(闰年)。
LocalDate.ofYearDay(2016, 365); // 2016-12-30(2016年12月30日)
LocalDate.ofYearDay(2017, 365); // 2017-12-31(2017年12月31日)
不过需要注意,闰年的第366天可以有,非闰年的第366天会抛出异常:
LocalDate.ofYearDay(2016, 366); // 2016-12-31(2016年12月31日)
LocalDate.ofYearDay(2017, 366); // 会抛异常,因为2017年不是闰年
LocalDate 的年份、月份、日期及长度信息
考虑以下 LocalDate 实例:
LocalDate date = LocalDate.of(2017, 11, 25); // 2017-11-25(2017年11月25日)
可以获取年份、月份、当月第几天、当年第几天:
int year = date.getYear(); // 2017
int month = date.getMonthValue(); // 11
int dayOfMonth = date.getDayOfMonth(); // 25
int dayOfYear = date.getDayOfYear(); // 329
还能获取该年的天数和该月的天数:
int lenOfYear = date.lengthOfYear(); // 365
int lenOfMonth = date.lengthOfMonth(); // 30
LocalDate 的算术运算方法
LocalDate 还提供了添加、减少或改变天、月、年的方法。比如创建一个日期:
LocalDate date = LocalDate.of(2017, 1, 1); // 2017-01-01(2017年1月1日)
然后用这些方法:
LocalDate tomorrow = date.plusDays(1); // 2017-01-02(2017年1月2日)
LocalDate yesterday = date.minusDays(1); // 2016-12-31(2016年12月31日)
LocalDate inTwoYears = date.plusYears(2); // 2019-01-01(2019年1月1日)
LocalDate in2016 = date.withYear(2016); // 2016-01-01(2016年1月1日)
总结
如你所见,LocalDate
类提供了丰富且实用的方法来处理日期。它是不可变的(immutable),每个方法调用都会返回该类的新实例,所以请放心使用这些方法!