Java8新的时间日期类的使用
LocalDate类:
LocalDate类实例是一个不可变对象,它只提供了简单的日期,并不包含当天的时间信息,另外,它也不附带任何与时区相关的信息
我们可以通过静态工厂方法of创建一个localDate实例
LocalDate date = LocalDate.of(2022, 1, 6);
LocalDate类实例提供了多种方法来读取常用的值,比如年份/月份/星期几等. 如下所示
LocalDate date = LocalDate.of(2014, 3, 18);
int year = date.getYear(); //2014
Month month = date.getMonth(); //MARCH --3月份
int monthValue = date.getMonthValue();//3
int day = date.getDayOfMonth(); //18
DayOfWeek dow = date.getDayOfWeek(); //TUESDAY
int i = date.lengthOfMonth(); //31 days in march
boolean leap = date.isLeapYear(); //是否是闰年?不是闰年
我们还可以使用工厂方法直接从系统时钟中获取当前的日期:
LocalDate now = LocalDate.now();
还有其他类提供了类似的工厂方法我们还可以通过传递一个TemporalField参数给get方法拿到同样的信息,TemporalField是一个接口,定义了如何访问temporal对象某个字段的值. ChronoField枚举实现了这一接口,所以你可以很方便的使用get方法得到枚举元素的值,如下所示
LocalDate d = LocalDate.now();
int i = d.get(ChronoField.YEAR);
int mouth=d.get(ChronoField.MONTH_OF_YEAR);
int day=d.get(ChronoField.DAY_OF_MONTH);
一天中的时间,比如14:48:05,可以用LocalTime类表示 你可以使用of重载的两个工厂方法创建LocalTime的实例. 第一个重载函数接收小时和分钟,第二个重载函数同时还接收秒. 同LocalDate一样,LocalTime类也提供了一些getter方法访问这些变量的值
LocalTime time = LocalTime.of(14, 48, 5);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
System.out.println(time);
LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse,我们可以实现这一个目的:
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time1 = LocalTime.parse("13:45:20");
LocalDateTime类:
这个复合类名叫LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期 和时间,但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造,如下所示。
LocalTime time = LocalTime.of(14, 48, 5);
LocalDate date =LocalDate.now();
LocalDateTime dt1 = LocalDateTime.of(date, time);
LocalDateTime dt2 = LocalDateTime.of(2022, Month.JANUARY, 6, 14, 59, 19);
LocalDateTime dt3 = date.atTime(time);
LocalDateTime dt4 = date.atTime(14, 59, 20);
LocalDateTime dt5 = time.atDate(date);
操纵/解析和格式化日期
假如我们已经有一个LocalDate对象,想要创建它的一个修改版,最简单也最直接的方法是使用withAttribute方法. withAttribute方法会创建对象的一个副本,并按照需要修改它的属性. 注意,下面的这段代码中所有的方法都返回一个修改了属性的对象 它们都不会修改原来的对象
LocalDate date1=LocalDate.of(2022,1,6);
LocalDate date2 = date1.withYear(2023);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);
还可以以声明的方式操纵LocalDate对象. 比如,你可以像下面这段代码那样加上或者减去一段时间
LocalDate date1 = LocalDate.of(2014, 3, 18);
LocalDate date2=date1.plusDays(1);
LocalDate date3=date2.minusYears(3);
date3.plus(6, ChronoUnit.MONTHS);
打印输出及解析日期-时间对象
使用Java.time.format包
这个包中,最重要的类是DateTime-Formatter 创建格式器最简单的方法是通过它的静态工厂方法以及常量 像BASIC_ISO_DATE和ISO_LOCAL_DATE这样的常量是DateTimeFormatter 类的预定义实例。所有的 DateTimeFormatter实例都能用于以一定的格式创建代表特定日期或时间的字符串。比如,下 面的这个例子中,我们使用了两个不同的格式器生成了字符串:
LocalDate date =LocalDate.now();
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20220106
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2014-03-18