【笔记】Java的日期和时间

前言

Java的日期和时间学习笔记

引入依赖

1
import java.time.*;

创建对象

当前日期和时间

无时区

1
LocalDateTime now = LocalDateTime.now();

有时区

1
ZonedDateTime now = ZonedDateTime.now();
1
OffsetDateTime now = OffsetDateTime.now().atoOffset(ZoneOffset.of("+08:00:00"));

仅日期

1
LocalDate now = LocalDate.now();

仅时间

1
LocalTime now = LocalTime.now();

任意日期和时间

Month.JANUARY:月份常量

1
LocalDateTime ldt = LocalDateTime.of(2016, 1, 2, 15, 4, 5);
1
2
3
4
LocalDate ld = LocalDate.of(2016, Month.JANUARY, 2);
LocalTime lt = LocalTime.of(15, 4, 5);

LocalDateTime ldt = LocalDateTime.of(ld, lt);

仅日期

1
LocalDate ld = LocalDate.of(2016, 1, 2);

仅时间

1
LocalTime lt = LocalTime.of(15, 4, 5);

当前时间戳

毫秒

1
long timestamp = Instant.now().toEpochMilli();

获取年月日时分秒

1
2
3
4
5
6
7
LocalDateTime ldt = LocalDateTime.now();
int year = ldt.getYear();
int month = ldt.getMonthValue();
int day = ldt.getDayOfMonth();
int hour = ldt.getHour();
int minute = ldt.getMinute();
int second = ldt.getSecond();

修改年月日时分秒

1
2
3
4
5
6
7
LocalDateTime ldt = LocalDateTime.now();
ldt = ldt.withYear(2016)
.withMonth(1)
.withDayOfMonth(2)
.withHour(15)
.withMinute(4)
.withSecond(5);

增减年月日时分秒

1
2
3
4
5
6
7
LocalDateTime ldt = LocalDateTime.now();
ldt = ldt.plusYears(1)
.plusMonths(1)
.plusDays(1)
.plusHours(1)
.plusMinutes(1)
.plusSeconds(1);
1
2
3
4
5
6
7
LocalDateTime ldt = LocalDateTime.now();
ldt = ldt.minusYears(1)
.minusMonths(1)
.minusDays(1)
.minusHours(1)
.minusMinutes(1)
.minusSeconds(1);

比较日期和时间

1
2
3
4
5
6
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.now();

boolean result1 = ldt1.isBefore(ldt2);
boolean result2 = ldt1.isAfter(ldt2);
boolean result3 = ldt1.isEqual(ldt2);
1
2
3
4
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.now();

boolean result = ldt1.compareTo(ldt2);

日期和时间与时间戳互转

日期和时间转换为时间戳

无时区

1
2
LocalDateTime ldt = LocalDateTime.now();
long timestamp = ldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

有时区

1
2
ZonedDateTime zdt = ZonedDateTime.now();
long timestamp = zdt.toInstant().toEpochMilli();

时间戳转换为日期和时间

无时区

1
2
long timestamp = Instant.now().toEpochMilli();
LocalDateTime ldt = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());

有时区

1
2
long timestamp = Instant.now().toEpochMilli();
ZonedDateTime zdt = Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault());

格式化日期和时间

日期和时间转换为字符串

1
2
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = fmt.format(LocalDateTime.now());

字符串转换为日期和时间

通过自定义格式化字符串格式化

日期和时间
1
2
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2006-01-02 15:04:05", fmt);
仅日期
1
2
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.parse("2006-01-02", fmt);
仅时间
1
2
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime lt = LocalTime.parse("15:04:05", fmt);

通过格式化字符串常量格式化

1
2
3
LocalDateTime ldt = LocalDateTime.parse("2006-01-02T15:04:05Z", DateTimeFormatter.ISO_DATE_TIME);
LocalDate ld = LocalDate.parse("2006-01-02", DateTimeFormatter.ISO_LOCAL_DATE);
LocalTime lt = LocalTime.parse("15:04:05", DateTimeFormatter.ISO_LOCAL_TIME);

时间差

秒和纳秒

创建对象

1
Duration duration = Duration.ofSeconds(1);

计算两个时间的时间差

1
2
3
4
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.now();

Duration duration = Duration.between(ldt1, ldt2);

获取秒和纳秒

1
2
long seconds = duration.getSeconds();
long nano = duration.getNano();

日期和时间对象计算

1
ldt.plus(duration);

年月日

创建对象

1
Period period = Period.ofDays(1);

获取两个日期的时间差

1
2
3
4
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.now();

Period period = Period.between(ld1, ld2);

获取年月日

1
2
3
long years = period.getYears();
long months = period.getMonths();
long days = period.getDays();

日期和时间对象计算

1
ldt.plus(period);

完成

参考文献

哔哩哔哩——青空の霞光