jdk8时间类

记录jdk相关的时间类的使用方式

相关的类是在java.time这个包下面,这个包是线程安全的

LocalDateTime

有点类似Calendar,不带时区的日期时间。

Instant

存在时区的问题,默认使用的是UTC的时间。时间可以精确到纳秒级别

有点类似java.util.Date

实例

获取默认的时间

1
2
3
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now();

字符串跟时间的相互转换

1
2
3
4
5
6
7
8
9
import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;

// 字符串转时间
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime startTime = LocalDateTime.parse("2022-03-25 14:00:00", df);
// 时间转字符串
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timeStr = df.format(LocalDateTime.now());

毫秒和时间相互转换

1
2
3
4
// 时间转毫秒
long mill = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// 毫秒转时间
LocalDateTime.ofInstant(Instant.ofEpochMilli(mill), ZoneId.systemDefault());

加减指定时间单位的数据

通过LocalDateTime我们可以很方便的加减天数或月数

1
2
3
4
5
6
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 加一天
LocalDateTime addOneDay = now.plusDays(1);
// 通过指定时间单位进行加减
LocalDateTime addOneMonths = now.plus(1, ChronoUnit.MONTHS);

周相关的操作

1
2
3
4
5
6
7
8
9
LocalDateTime now = LocalDateTime.now();
// 获取当前周的周一
LocalDateTime monday = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
// 获取下周一
LocalDateTime nextMonday = now.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
// 获取本月第一个周一
LocalDateTime firstMondayInMonth = now.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
// 获取本月最后一个周一
LocalDateTime lastMondayInMonth = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));