Java中LocalDateTime使用
1. 简介
LocalDateTime、LocalDate、LocalTime 是Java8全新的日期框架,较之前的util.Date以及Calander使用起来更加的方便直观,下面介绍几种常见的日期对象用法。
LocalDateTime:日期加时间的日期对象,包含年月日时分秒
LocalDate:日期类,包含年月日
LocalTime:时间类,包含时分秒
LocalDate、LocalTime、LocalDateTime、Instant均为不可变对象,修改这些对象对象会返回一个副本。而并非在原对象上修改。
2. LocalDateTime用法
2.1 获取当前的时间
LocalDateTime now = LocalDateTime.now();
2.2 根据年月日格式化时间
LocalDateTime localDateTime = LocalDateTime.of(2021, 6, 16, 16, 37, 20, 814 * 1000 * 1000);
LocalDateTime ldt = LocalDateTime.now().withYear(2021).withMonth(6).withDayOfMonth(16).withHour(10).withMinute(10).withSecond(59).withNano(999 * 1000 * 1000);
注意:最后一个参数是纳秒
2.3 获取时区东八区的时间
LocalDateTime datetime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
LocalDateTime datetime2 = LocalDateTime.now(ZoneId.of("+8"));
2.4 从LocalDateTime中获取年月日等时间信息
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int dayOfYear = now.getDayOfYear();
int dayOfMonth = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int nano = now.getNano();
System.out.println(year + " " + month + " " + dayOfYear + " " + dayOfMonth);
System.out.println(hour + " " + minute + " " + second + " " + nano);
2.5 从LocalDateTime中获取LocalDate与LocalTime
LocalDate localDate = now.toLocalDate();
LocalTime localTime = now.toLocalTime();
2.6 日期计算
LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1L);
tomorrow = tomorrow.plusHours(2L);
tomorrow = tomorrow.plusMinutes(10L);
LocalDateTime yesterday = now.minus(Duration.ofDays(1));
yesterday = yesterday.plusHours(2L);
yesterday = yesterday.plusMinutes(10L);
System.out.println(tomorrow);
System.out.println(yesterday);
注意:LocalDateTime、LocalDate、LocalTime 日期对象每次修改都会创建一个新的对象,而非在原有对象基础上修改
2.7 获取某天的整点时间,通过with修改值
LocalDateTime now = LocalDateTime.now();
LocalDateTime ldt1 = now.withHour(10).withMinute(0).withSecond(0).withNano(0);
2.8 获取毫秒值
Instant instant = Instant.now();
long min = instant.toEpochMilli();
System.out.println(min);
2.9 计算两个时间的时间差
下面这种方式可以获取两个时间点相差N年N月N日N时N分N秒
LocalDateTime fromDateTime = LocalDateTime.of(1992, 6, 11, 10, 23, 55);
LocalDateTime toDateTime = LocalDateTime.now();
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);
long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);
tempDateTime = tempDateTime.plusYears(years);
long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);
tempDateTime = tempDateTime.plusMonths(months);
long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);
tempDateTime = tempDateTime.plusDays(days);
long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);
tempDateTime = tempDateTime.plusHours(hours);
long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);
tempDateTime = tempDateTime.plusMinutes(minutes);
long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);
System.out.println("" + java.time.Duration.between(tempDateTime, toDateTime).toHours());
System.out.println(years + " years "
+ months + " months "
+ days + " days "
+ hours + " hours "
+ minutes + " minutes "
+ seconds + " seconds.");
如果只想获取两个时间相差的天数或者小时数,可以使用以下方法
LocalDateTime ldt1 = LocalDateTime.of(1992, 6, 11, 10, 23, 55);
LocalDateTime ldt2 = LocalDateTime.now();
System.out.println(Duration.between(ldt1, ldt2).toDays());
System.out.println(Duration.between(ldt1, ldt2).toHours());
3. LocalDateTime与Date、String互转
3.1 LocalDateTime 转 Date
public static Date localDateTime2Date(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
3.2 LocalDateTime 转 String
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String localDateTime2String(LocalDateTime localDateTime) {
return localDateTime.format(DATE_TIME_FORMATTER);
}
注意:DateTimeFormatter是线程安全的类,可以将此类放到常量中。
3.3 String 转 LocalDateTime
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static LocalDateTime string2LocalDateTime(String str) {
return LocalDateTime.parse(str, DATE_TIME_FORMATTER);
}
3.4 String 转 Date
public static Date string2Date(String str) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.parse(str);
}
注意:SimpleDateFormat是非线程安全的类,在多线程操作时会报错,所以此对象每次用的时候最好新建。或者作为方法入参传递进来。
3.5 Date 转 LocalDateTime
public static LocalDateTime date2LocalDateTime(Date date) {
return date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
3.6 Date 转 String
public static String date2String(Date date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return formatter.format(date);
}