使用 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);
|
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(); }
|
1 2
| DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); System.out.println(dateTimeFormatter.format(LocalDateTime.now()));
|
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();
System.out.println(instant);
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4));
instant.minus(5, ChronoUnit.DAYS); instant.minus(Duration.ofDays(5));
long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1);
System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant));
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
| Date timestampDate = new Date(timestamp.getTime());
Date calendarDate = calendar.getTime();
Date instantDate = Date.from(instant);
Date localDateTimeDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
Date zonedDateTimeDate = Date.from(zonedDateTime.toInstant());
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
| Instant dateInstant = date.toInstant();
Instant timestampInstant = timestamp.toInstant();
Instant calendarInstant = calendar.toInstant();
Instant localDateTimeInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Instant zonedDateTimeInstant = zonedDateTime.toInstant();
Instant localDateInstant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
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
| LocalDateTime dateLocalDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDateTime timestampLocalDateTime = timestamp.toLocalDateTime();
LocalDateTime calendarLocalDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault());
LocalDateTime instantLocalDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDateTime zonedDateTimeLocalDateTime = zonedDateTime.toLocalDateTime();
LocalDateTime localDateLocalDateTime = localDate.atStartOfDay();
|
转Timestamp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Timestamp dateTimestamp = new Timestamp(date.getTime());
Timestamp calendarTimestamp = new Timestamp(calendar.getTimeInMillis());
Timestamp instantTimestamp = Timestamp.from(instant);
Timestamp localDateTimeTimestamp = Timestamp.valueOf(localDateTime);
Timestamp zonedDateTimeTimestamp = Timestamp.from(zonedDateTime.toInstant());
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
| Calendar dateCalendar = Calendar.getInstance(); dateCalendar.setTime(date);
Calendar timestampCalendar = Calendar.getInstance(); timestampCalendar.setTimeInMillis(timestamp.getTime());
Calendar instantCalendar = GregorianCalendar.from(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()));
Calendar localDateTimeCalendar = GregorianCalendar.from(ZonedDateTime.of(localDateTime, ZoneId.systemDefault()));
Calendar zonedDateTimeInstantCalendar = GregorianCalendar.from(zonedDateTime);
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
| LocalDate dateLocalDate = LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDate dateLocalDate = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
LocalDate timestampLocalDate = timestamp.toLocalDateTime().toLocalDate();
LocalDate calendarLocalDate = LocalDate.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault());
LocalDate calendarLocalDate = LocalDateTime.ofInstant(calendar.toInstant(), ZoneOffset.systemDefault()).toLocalDate();
LocalDate instantLocalDate = LocalDate.ofInstant(instant, ZoneId.systemDefault());
LocalDate instantLocalDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();
LocalDate localDateTimeLocalDate = localDateTime.toLocalDate();
LocalDate zonedDateTimeLocalDate = zonedDateTime.toLocalDate();
|
线程不安全
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
| LocalDate startDate = LocalDate.of(year, 1, 1);
LocalDate endDate = YearMonth.of(year, 12).atEndOfMonth();
public static DateTime oneMonthAgo() { return DateUtil.beginOfMonth(DateUtil.date()); }
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
| 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; }
|