package com.akaiqi.chun.time;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
import static java.time.temporal.ChronoUnit.DAYS;
/**
* 日期:年-月-日
*
* @author akaiqi
* @date 2019/11/1 15:18
*/
public class LocalDateTest {
/**
* 通过静态工厂方法of创建一个LocalDate实例
* 然后获取这个时间年,月,日,一年的第几天,星期几等
*/
private static void test1() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date); //2019-11-01
int year = date.getYear();
Month month = date.getMonth();
System.out.println(month); //NOVEMBER
System.out.println(month.getValue());//11
int day = date.getDayOfMonth();
System.out.println(day);//1
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println(dayOfWeek);//FRIDAY
int len = date.lengthOfMonth();
System.out.println(len);//(这个月有)30
boolean leap = date.isLeapYear();
System.out.println(leap);//false(闰年?)
}
/**
* 从系统时钟中获取当前的日期,
* 使用TemporalField读取LocalDate的值,使用get()方法获取
* TemporalField是一个最终的、不可变的、线程安全的枚举。
*/
private static void test2() {
LocalDate today = LocalDate.now();
System.out.println(today);
int year = today.get(ChronoField.YEAR);
int month = today.get(ChronoField.MONTH_OF_YEAR);
int day = today.get(ChronoField.DAY_OF_MONTH);
System.out.println(year + "年");//2019年
System.out.println(month + "月");//11月
System.out.println(day + "日");//1日
}
/**
* compareTo:将此日期与另一个日期进行比较。比较器值为负,如果较小,则如果较大则为正
* 一般都是LocalDate 类型比较,如果一些被比较的日期是不同的年表,那么年龄也被考虑,见ChronoLocalDate.compareTo(java.time.chrono.ChronoLocalDate)
* <p>
* equals(Object obj):如果这等于其他日期,则为真 obj=null返回false.源码实现:同一对象返回true,是LocalDate实例,则分别按年-月-日取比较
* hashCode:日期的哈希码,同一时间的哈希值一样
*/
private static void test3() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2019, 11, 2);
LocalDate date3 = LocalDate.of(2020, 11, 1);
LocalDate date4 = LocalDate.of(2019, 11, 1);
System.out.println(date1.compareTo(date2));//-1
System.out.println(date1.compareTo(date3));//-1
System.out.println(date3.compareTo(date2));//1
System.out.println(date1.equals(date4));//true
System.out.println(date1.equals(date2));//false
System.out.println(date1.hashCode());//4135617 同一时间的哈希值一样
System.out.println(date4.hashCode());//4135617
}
/**
* format(DateTimeFormatter formatter):日期格式化
*/
private static void test4() {
LocalDate date = LocalDate.of(2019, 11, 1);
String dateStr1 = date.format(DateTimeFormatter.ofPattern("yyyy MM dd"));
System.out.println(dateStr1); //2019 11 01
String dateStr2 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(dateStr2);//2019年11月01日
String dateStr3 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月"));
System.out.println(dateStr3);//2019年11月
}
/**
* lengthOfMonth:这个月有多少天
* lengthOfYear:今年有多少天
*/
private static void test5() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.lengthOfMonth());//30
System.out.println(date.lengthOfYear());//365
}
/**
* minusMonths(long monthsToSubtract):减去monthsToSubtract个月后的日期
* minusDays(long daysToSubtract):减去daysToSubtract日后的日期
* minusMonths(long monthsToSubtract) :返回此 LocalDate一个副本,其中指定的周期以周为单位减去
* minusYears(long yearsToSubtract) :返回此 LocalDate的副本,以减去的年份为单位
* <p>
* minus(long amountToSubtract, TemporalUnit unit) :返回此日期的副本,减去指定的单位。unit时间单位
*/
private static void test6() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.minusMonths(1));//2019-10-01
System.out.println(date.minusDays(1));//2019-10-31
System.out.println(date.minusWeeks(1));//2019-10-25
System.out.println(date.minusYears(1));//2018-11-01
System.out.println(date.minus(1, DAYS));//2019-10-31
//同理,还有其他单位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS
}
/**
* plus(long amountToAdd, TemporalUnit unit) :返回此日期的副本,并添加指定的时间单位
* plusDays(long daysToAdd) :日增加
* plusMonths(long monthsToAdd):月增加
* plusWeeks(long weeksToAdd):星期增加
* plusYears(long yearsToAdd):年增加
*/
private static void test7() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.plus(1, DAYS));//2019-11-02
//同理,还有其他单位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS,
}
/**
* query(TemporalQuery<R> query):获取某个字段的范围
* range(TemporalField field)
* <p>
* toEpochDay():将此日期转换为大纪元日。
* <p>
* toString():输入日期(字符串类型)
*/
private static void test8() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.range(ChronoField.DAY_OF_MONTH));//这个月的范围:1 - 30
System.out.println(date.toEpochDay()); //18201
}
/**
* until:计算两个LocalDate对象之间的时间量,单个TemporalUnit
* <p>
* until(Temporal endExclusive,TemporalUnit unit):两个日期之间的相差多少,可转换单位:DAYS,MONTHS(TemporalUnit)等
* 等价于TemporalUnit.between(Temporal, Temporal)
*/
private static void test9() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2019, 12, 1);
System.out.println(date1.until(date2));//P1M
System.out.println(date1.until(date2, DAYS));//30
//方法二
System.out.println(DAYS.between(date1, date2));//30
}
/**
* with(TemporalField field,long newValue):按指定单位修改日期
* <p>
* withYear(int year):修改年份
* withMonth(int month):修改月份
* withDayOfMonth(int dayOfMonth):修改日
* <p>
* withDayOfYear
*/
private static void test10() {
LocalDate date = LocalDate.of(2019, 11, 1);
LocalDate date2 = date.with(DAY_OF_MONTH, 2);//2019-11-02 年月不变,修改日期
System.out.println(date2);
LocalDate date3 = date.withYear(2020);
System.out.println(date3);//2020-11-01
LocalDate date4 = date.withMonth(12);
System.out.println(date4);//2019-12-01
LocalDate date5 = date.withDayOfMonth(30);
System.out.println(date5);//2019-11-30
}
/**
* adjustInto:调整指定的时间对象与此对象的日期相同。
* 等价于使用Temporal.with(TemporalField, long)通过ChronoField.EPOCH_DAY作为字段
*/
private static void test11() {
LocalDate date1 = LocalDate.of(2019, 11, 1);
LocalDate date2 = LocalDate.of(2020, 1, 1);
Temporal temporal = date1.adjustInto(date2);
System.out.println(temporal);//2019-11-01
System.out.println(temporal.with(date2));//2020-01-01
}
/**
* 获取LocalDateTime:年与日时分秒
* atStartOfDay():在此日期开始之前的午夜00:00时时间
* atTime(int hour, int minute, int second):结合此日期与时间创建一个 LocalDateTime 。
* atTime(int hour, int minute)
* atTime(int hour, int minute, int second, int nanoOfSecond)
* atTime(LocalTime time) :LocalTime时分秒
*/
private static void test12() {
LocalDate date = LocalDate.of(2019, 11, 1);
System.out.println(date.atStartOfDay());//2019-11-01T00:00
LocalDateTime time = date.atTime(12, 0, 0);
System.out.println(time);//2019-11-01T12:00
LocalTime localTime = LocalTime.of(1, 1, 1);
System.out.println(localTime);//01:01:01
LocalDateTime localDateTime = date.atTime(localTime);
System.out.println(localDateTime);//2019-11-01T01:01:01
}
public static void main(String[] args) {
test12();
}
}
LocalDate的API操作
最新推荐文章于 2025-04-20 10:34:50 发布