JDK1.8以前使用 Date 可读性差
而且需要配合simpleDateFormat,但simpleDateFormat是线程不安全的(是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。日期格式不同步,多线程环境下,必须在外部进行同步。)
JDK1.8 提供了LocalDate,LocalTime,LocalDateTime
LocalDate 不可变(final修饰)线程安全
-
LocalDate
是一个不可变的日期时间对象,表示日期,通常被视为年月日。 也可以访问其他日期字段,例如日期,星期几和星期。 例如,值“2007年10月2日”可存储在LocalDate
。该类不存储或表示时间或时区。 相反,它是日期的描述,用于生日。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。
使用身份敏感的操作(包括引用相等(的
==
上的实例),标识哈希码,或同步)LocalDate
可具有不可预测的结果,应当避免。equals
方法应用于比较。
Fields 最大值和最小值
public static final LocalDate MIN = LocalDate.of(Year.MIN_VALUE, 1, 1); //最低支持 LocalDate ,'-999999999-01-01'。
/**
* The maximum supported {@code LocalDate}, '+999999999-12-31'.
* This could be used by an application as a "far future" date.
*/
public static final LocalDate MAX = LocalDate.of(Year.MAX_VALUE, 12, 31);//最大支持 LocalDate '''999999999-12-31'。
//获取当前时间
LocalDate now = LocalDate.now();
System.out.println(now);
//设置日期
LocalDate localDate = LocalDate.of(2021, 5, 7);
System.out.println(localDate);
//获取年
int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
System.out.println("getYear()"+year);
System.out.println("ChronoField"+year1);
//获取月
Month month = localDate.getMonth(); // 结果:SEPTEMBER
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果:9
System.out.println(month);
System.out.println(month1);
//获取日
int day = localDate.getDayOfMonth(); //结果:10
int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果:10
System.out.println(day);
System.out.println(day1);
//获取星期数
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
System.out.println(dayOfWeek);
System.out.println(dayOfWeek1);
还有其他常用的方法 可以jdk文档查阅
例如
-
-
-
public static LocalDate of(int year, Month month, int dayOfMonth)
从一年,一个月和一天获得一个
LocalDate
的实例。这将返回一个
LocalDate
与指定的年,月和日。 该日期必须在年和月中有效,否则将抛出异常。-
参数
year
- 从MIN_YEAR到MAX_YEAR的年份month
- 代表的月份,不为空dayOfMonth
- 代表从1到31的月份
-
-
-
equals(); 只是LocalDate对象之间比较,类型不一致返回false
LocalTime
-
LocalTime
是一个不可变的日期时间对象,代表一个时间,通常被看作是小时 - 秒。 时间表示为纳秒精度。 例如,值“13:45.30.123456789”可以存储在LocalTime
。它不存储或表示日期或时区。 相反,它是在挂钟上看到的当地时间的描述。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。
使用身份敏感的操作(包括引用相等(的
==
上的实例),标识哈希码,或同步)LocalTime
可具有不可预测的结果,应当避免。 应使用equals
方法进行比较。 -
// 获取当前时间 LocalTime localTimeNow = LocalTime.now(); // 设置时间 LocalTime localTime = LocalTime.of(13, 51, 10); //获取小时 int hour = localTime.getHour(); // 结果:13 int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13 System.out.println(hour); System.out.println(hour1); //获取分 int minute = localTime.getMinute(); // 结果:51 int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51 System.out.println(minute); System.out.println(minute1); //获取秒 int second = localTime.getSecond(); // 结果:10 int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10 System.out.println(second); System.out.println(second1);
LocalDateTime 相当于LocalDate+LocalTime
LocalDateTime localDateTime = LocalDateTime.now();
// 设置日期
LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime3 = localDate.atTime(localTime);
LocalDateTime localDateTime4 = localTime.atDate(localDate);
System.out.println(localDateTime1);
System.out.println(localDateTime2);
System.out.println(localDateTime3);
System.out.println(localDateTime4);
// 获取LocalDate
LocalDate localDate2 = localDateTime.toLocalDate();
// 获取LocalTime
LocalTime localTime2 = localDateTime.toLocalTime();
通过PLus方法 增加 指定 年 月 日 分 秒
LocalDateTime localDateTime = LocalDateTime.of(2019,2,10,14,16,56);
localDateTime = localDateTime.plusYears(1);
System.out.println(localDateTime); //2020-02-10T14:16:56
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //2021-02-10T14:16:56
通过with修改某些值,年月日时分秒都可以通过with方法设置
localDateTime = localDateTime.withYear(2019);
System.out.println(localDateTime);
System.out.println(localDateTime.getDayOfWeek());
localDateTime = localDateTime.with(ChronoField.DAY_OF_WEEK,5);
System.out.println(localDateTime);
格式化时间
LocalDate localDate = LocalDateTime.now().toLocalDate();
localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
System.out.println(localDate); //和SimpleDateFormat相比,DateTimeFormatter是线程安全的
SpringBoot中应用LocalDateTime
将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类
public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
}
并在LocalDateTime字段上添加@JsonSerialize(using = LocalDateTimeConverter.class)注解,如下:
@JsonSerialize(using = LocalDateTimeConverter.class)
protected LocalDateTime gmtModified;
将LocalDateTime字段以指定格式化日期的方式返回给前端 在LocalDateTime字段上添加@JsonFormat(shape=JsonFormat.Shape.STRING, pattern=“yyyy-MM-dd HH:mm:ss”)注解即可,如下:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;
对前端传入的日期进行格式化 在LocalDateTime字段上添加@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解即可,如下:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;