LocalDate、LocalTime、LocalDateTime、DateTimeFormatter

使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat

参考:什么?你项目还在用 Date 表示时间?!

LocalDateTime 是线程安全的

获取当前此刻的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LocalDateTime rightNow = LocalDateTime.now();
System.out.println( "当前时刻: " + rightNow);
System.out.println( "当前年份: " + rightNow.getYear());
System.out.println( "当前月份: " + rightNow.getMonth());
System.out.println( "当前日份: " + rightNow.getDayOfMonth());
System.out.println( "当前时: " + rightNow.getHour());
System.out.println( "当前分: " + rightNow.getMinute());
System.out.println( "当前秒: " + rightNow.getSecond());

//输出结果:
当前时刻: 2019-12-13T22:05:26.779当前年份: 2019
当前月份: DECEMBER
当前日份: 13
当前时:22
当前分: 5
当前秒:26

构造一个指定年、月、日的时间

比如,想构造:2019年10月12月12日9时21分32秒

1
LocalDateTime date = LocalDateTime.of(2019, Month.DECEMBER, 12, 9, 21, 32);

修改日期

注意:返回值为修改后的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LocalDateTime rightNow = LocalDateTime.now();

//增加 2 个小时
rightNow = rightNow.plusHours(2);

//增加 2 天
rightNow = rightNow.plusDays(2);

//增加3个月
rightNow = rightNow.plusMonths(3);

//减少2年
rightNow = rightNow.minusYears(2);

//直接修改年份到2008年
rightNow = rightNow.withYear(2008);

//直接修改小时到13时
rightNow = rightNow.withHour(13);

格式化日期 format

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LocalDateTime rightNow = LocalDateTime.now();
String result1 = rightNow.format(DateTimeFormatter.ISO_DATE);
string result2 = rightNow.format(DateTimeFormatter.BASIC_ISO_DATE);
String result3 = rightNow.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
String result3 = rightNow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
String result4 = rightNow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

System.out.println("格式化后的日期(基本样式一举例): " + result1);
System.out.println("格式化后的日期(基本样式二举例): " + result2);
System.out.println("格式化后的日期(自定义样式举例): " + result3);
System.out.println("格式化后的日期(自定义样式举例): " + result4);

//输出结果
格式化后的日期(基本样式一举例): 2020-07-10
格式化后的日期(基本样式二举例): 20200710
格式化后的日期(自定义样式举例): 2020/07/10
格式化后的日期(自定义样式举例): 2020-07-10 18:38
格式化后的日期(自定义样式举例): 2020-07-10 18:38:30

时间反解析

1
LocalDate localDate = LocalDate.parse("2023-05-16");

Date 与 LocalDate 间转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static Date asDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}

public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

public static LocalDate asLocalDate(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
}

public static LocalDateTime asLocalDateTime(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
}

DateTimeFormatter

1
2
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(dateTimeFormatter.format(LocalDateTime.now())); //2021-09-23 14:33

Instant

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 获得当前时间 
Instant instant = Instant.now();
// 以ISO-8601输出
System.out.println(instant);

//在现在的时间上加上5个小时4分钟:plus() 方法会产生一个新的实例
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4));

//计算5天前的时间
instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1
instant.minus(Duration.ofDays(5)); // Option 2 方法2

//计算两个Instant之间的分钟数
long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1
long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2

// 用compareTo方法比较
// instant1.compareTo(instant)=1
System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant));

// 使用isAfter()和isBefore()
// instant1.isAfter(instant)=true, instant1.isBefore(instant)=false
System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n",
instant1.isAfter(instant), instant1.isBefore(instant))

转Date

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Timestamp转Date
Date timestampDate = new Date(timestamp.getTime());

//Calendar转Date
Date calendarDate = calendar.getTime();

//Instant转Date
Date instantDate = Date.from(instant);

//LocalDateTime转Date
Date localDateTimeDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

//ZonedDateTime转Date
Date zonedDateTimeDate = Date.from(zonedDateTime.toInstant());

//LocalDate转Date
Date localDateDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

转Instant

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Date转Instant
Instant dateInstant = date.toInstant();

//Timestamp转Instant
Instant timestampInstant = timestamp.toInstant();

//Calendar转Instant
Instant calendarInstant = calendar.toInstant();

//LocalDateTime转Instant
Instant localDateTimeInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();

//ZonedDateTime转Instant
Instant zonedDateTimeInstant = zonedDateTime.toInstant();

//LocalDate转Instant
Instant localDateInstant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();

//TemporalAccessor 转 Instant
TemporalAccessor temporalAccessor = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").parse("2003-11-19 11:20:20");
Instant instant = Instant.from(temporalAccessor);

转LocalDateTime

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Date转LocalDateTime
LocalDateTime dateLocalDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

//Timestamp转LocalDateTime
LocalDateTime timestampLocalDateTime = timestamp.toLocalDateTime();

//Calendar转LocalDateTime
LocalDateTime calendarLocalDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault());

//Instant转LocalDateTime
LocalDateTime instantLocalDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

//ZonedDateTime转LocalDateTime
LocalDateTime zonedDateTimeLocalDateTime = zonedDateTime.toLocalDateTime();

//LocalDate转LocalDateTime
LocalDateTime localDateLocalDateTime = localDate.atStartOfDay();

转Timestamp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Date转Timestamp
Timestamp dateTimestamp = new Timestamp(date.getTime());

//Calendar转Timestamp
Timestamp calendarTimestamp = new Timestamp(calendar.getTimeInMillis());

//Instant转Timestamp
Timestamp instantTimestamp = Timestamp.from(instant);

//LocalDateTime转Timestamp
Timestamp localDateTimeTimestamp = Timestamp.valueOf(localDateTime);

//ZonedDateTime转Timestamp
Timestamp zonedDateTimeTimestamp = Timestamp.from(zonedDateTime.toInstant());

//LocalDate转Timestamp
Timestamp localDateTimestamp = Timestamp.valueOf(localDate.atStartOfDay());

转Calendar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Date转Calendar
Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(date);

//Timestamp转Calendar
Calendar timestampCalendar = Calendar.getInstance();
timestampCalendar.setTimeInMillis(timestamp.getTime());

//Instant转Calendar
Calendar instantCalendar = GregorianCalendar.from(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()));

//LocalDateTime转Calendar
Calendar localDateTimeCalendar = GregorianCalendar.from(ZonedDateTime.of(localDateTime, ZoneId.systemDefault()));

//ZonedDateTime转Calendar
Calendar zonedDateTimeInstantCalendar = GregorianCalendar.from(zonedDateTime);

//LocalDate转Calendar
Calendar localDateCalendar = GregorianCalendar.from(localDate.atStartOfDay(ZoneId.systemDefault()));

转LocalDate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Date转LocalDate
LocalDate dateLocalDate = LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault()); //jdk11

LocalDate dateLocalDate = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();

//Timestamp转LocalDate
LocalDate timestampLocalDate = timestamp.toLocalDateTime().toLocalDate();

//Calendar转LocalDate
LocalDate calendarLocalDate = LocalDate.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault()); //jdk11

LocalDate calendarLocalDate = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault()).toLocalDate();

//Instant转LocalDate
LocalDate instantLocalDate = LocalDate.ofInstant(instant, ZoneId.systemDefault()); //jdk11

LocalDate instantLocalDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();

//LocalDateTime转LocalDate
LocalDate localDateTimeLocalDate = localDateTime.toLocalDate();

//ZonedDateTime转LocalDate
LocalDate zonedDateTimeLocalDate = zonedDateTime.toLocalDate();

SimpleDateFormat

线程不安全

1
2
3
4
5
6
7
8
9
10
//线程安全
public static ThreadLocal<SimpleDateFormat> date_sdf = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};

//当前时间
date_sdf.get().format(new Date())

代码片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 获取指定年份 1 月 1 号日期,示例 2023-01-01
LocalDate startDate = LocalDate.of(year, 1, 1);

// 获取指定年份指定月份最后一天日期,示例 2023-12-31
LocalDate endDate = YearMonth.of(year, 12).atEndOfMonth();

// 获取当月开始日期,示例:2023-11-01 00:00:00
public static DateTime oneMonthAgo() {
return DateUtil.beginOfMonth(DateUtil.date());
}

// 当前日期 7天前的日期
public static DateTime sevenDaysAgo() {
return DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), -7));
}

// 获取指定日期加若干天后的日期
public static DateTime getDateTimeOffsetDays(Date date, int days) {
return DateUtil.offsetDay(date, days);
}

// 根据年份,获取随机日期,要求小于当前日期
public static List<LocalDate> getDatesInYear(int year) {
List<LocalDate> dates = new ArrayList<>();
LocalDate startDate = LocalDate.of(year, 1, 1);
LocalDate endDate = YearMonth.of(year, 12).atEndOfMonth();

if (year == LocalDate.now().getYear()) {
endDate = LocalDate.now();
}

for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1)) {
dates.add(date);
}

return dates;
}

获取 2 个时间之间随机的时间

1
2
3
4
5
6
7
// 获取 2 个时间之间随机时间
public static LocalTime getRandomTime(LocalTime startTime, LocalTime endTime) {
long startSeconds = startTime.toSecondOfDay();
long endSeconds = endTime.toSecondOfDay();
long randomSeconds = startSeconds + (long)(Math.random() * (endSeconds - startSeconds));
return LocalTime.ofSecondOfDay(randomSeconds);
}

根据年份,获取随机日期,要求小于当前日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 根据年份,获取随机日期,小于当前日期
public static List<LocalDate> getDatesInYear(int year) {
List<LocalDate> dates = new ArrayList<>();
LocalDate startDate = LocalDate.of(year, 1, 1);
LocalDate endDate = YearMonth.of(year, 12).atEndOfMonth();

if (year == LocalDate.now().getYear()) {
endDate = LocalDate.now();
}

for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1)) {
dates.add(date);
}

return dates;
}