Java中LocalDateTime的使用

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值