目录
LocalDate、LocalDateTime、LocalTime
String、Date、LocaDate、LocalTime、LocalDateTime 相互转换
Java8 中吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于本地时间(LocalDate)、本地时间(LocalTIme)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。下面简单介绍其使用方法。
LocalDate、LocalDateTime、LocalTime
获取当前时间
//获取当前时间 now()/now(ZoneId zone)
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
输出:
2021-07-03
20:09:18.472
2021-07-03T20:09:18.472
设置指定的时间
//of(): 设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 8, 1, 1, 1);
输出:
2020-10-08T01:01:01
//获取一天中小时间和最大时间
LocalDate localDate = LocalDate.now();
ystem.out.println(localDate);
LocalDateTime min = LocalDateTime.of(localDate, LocalTime.MIN);
System.out.println(min);
LocalDateTime max = LocalDateTime.of(localDate, LocalTime.MAX);
System.out.println(max);
输出:
2021-09-26
2021-09-26T00:00
2021-09-26T23:59:59.999999999
获取年/月/日
//getXxx()
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek()); //枚举
System.out.println(localDateTime.getMonth()); //枚举
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getMinute());
输出:
3
SATURDAY
JULY
7
9
设置时间/日期(绝对值)
//设置时间/日期 withDayOfMonth()/withDayOfYear()/withMonth()/withYear()
LocalDate localDate1 = localDate.withDayOfMonth(5); //设置为本月第5天
System.out.println(localDate); // 不可变
System.out.println(localDate1);
输出:
2021-07-03
2021-07-05
设置偏移量
// 设置偏移量
LocalDateTime localDateTime3 = localDateTime.plusDays(3);
LocalDateTime localDateTime4 = localDateTime.minusDays(10);
System.out.println(localDateTime3);
System.out.println(localDateTime4);
输出:
2021-07-06T20:21:02.542
2021-06-23T20:21:02.542
Instant
时间线上的一个瞬时点,被用来记录应用程序中的事件时间戳。
now()
//日期变更子午线时间
Instant instant = Instant.now();
System.out.println(instant);
输出:
2021-07-03T12:21:02.543Z
添加偏移量(时区)
// 添加时间的偏移量--东八区时区
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
输出:
2021-07-03T20:21:02.543+08:00
获取时间戳(从1970年1月1日0时0分0秒开始的毫秒数)
long l = instant.toEpochMilli();
System.out.println(l);
输出:
1625314862543
根据毫秒时间戳返回Instant对象
Instant instant1 = Instant.ofEpochMilli(l);
System.out.println(instant1);
输出:
2021-07-03T12:21:02.543Z
DateTimeFormatter
ofPattern
静态方法,返回一个指定字符串格式的DateTimeFormatter
DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
format格式化为字符串
DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String format6 = dateTimeFormatter6.format(LocalDate.now());
System.out.println(format6);
输出:
2021-07-03
时间戳转为字符串
DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format6 = dateTimeFormatter6.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(1636370296330L),ZoneId.systemDefault()));
System.out.println(format6);
输出:
2021-11-08 19:18:16
parse解析为时间/日期
DateTimeFormatter dateTimeFormatter7 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(LocalDateTime.parse("2021-07-03 05:33:30",dateTimeFormatter7));
输出:
2021-07-03T05:33:30
Period
用于计算日期相对间隔(无法隔月计算)
//用于计算两个日期间隔
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse("2019-03-04", fmt);
LocalDate endDate = LocalDate.parse("2018-02-01", fmt);
Period period = Period.between(startDate, endDate);
System.out.println("相差:" + period.getYears() + " 年 " + period.getMonths() + " 个月 " + period.getDays() + " 天");
输出:
相差:-1 年 -1 个月 -3 天
隔月计算要用toEpochDay方法
//获取当前时间
LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = localDate1.plusDays(100);
// 无法隔月计算
System.out.println(Period.between(localDate1, localDate2).getDays());
System.out.println(localDate2.toEpochDay()-localDate1.toEpochDay());
输出:
8
100
Duration
用于计算时间间隔
//用于计算时间差
LocalDateTime localDateTime5 = LocalDateTime.now();
LocalDateTime localDateTime6 = localDateTime5.plusDays(1);
Duration between = Duration.between(localDateTime5, localDateTime6);
System.out.println(between.getSeconds());
输出:
86400
计算日期绝对间隔
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse("2019-03-01",fmt);
LocalDate endDate = LocalDate.parse("2020-07-08",fmt);
System.out.println("总相差的天数:" + startDate.until(endDate, ChronoUnit.DAYS));
System.out.println("总相差的月数:" + startDate.until(endDate, ChronoUnit.MONTHS));
System.out.println("总相差的年数:" + startDate.until(endDate, ChronoUnit.YEARS));
输出:
总相差的天数:495
总相差的月数:16
总相差的年数:1
常用日期获取
// 本周一
LocalDate.now().with(DayOfWeek.of(1));
// 下周一
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.of(1)));
// 本月第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
或
LocalDate.now().withDayOfMonth(1)
//下月第一天
LocalDate.now().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth())
输出:
2021-07-05
2021-07-12
2022-03-01
2022-03-01
2022-04-01
String、Date、LocaDate、LocalTime、LocalDateTime 相互转换
String 与 Date相互转换
// Date转String
Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf1.format(date));
sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.format(date));
sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf1.format(date));
--输出:
2021-11-21
2021-11-21 20:41:05
2021年11月21日 20:41:05
// String 转 Date
String string = "2016-10-24 21:59:06";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf2.parse(string));
--输出:
Mon Oct 24 21:59:06 CST 2016
String 与 LocaDate相互转换
// LocalDate 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 这里不能用 yyyy-MM-dd HH:mm:ss 原因是LocalDate本身不含时分秒
LocalDate now = LocalDate.now();
String localTime = df.format(now);
System.out.println(localTime);
--输出
2021-11-21
// String 转 LocalDate
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ldt = LocalDate.parse("2017-09-28", df);
System.out.println(ldt);
--输出
2017-09-28
或者
LocalDate ldt = LocalDate.parse("2017-09-28");
System.out.println(ldt);
--输出
2017-09-28
如果用yyyy-MM-dd HH:mm:ss但是输出仍然只是年月日
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate ldt = LocalDate.parse("2017-09-28 11:11:11", df);
System.out.println(ldt);
--输出
2017-09-28
String 与 LocaTime相互转换
// LocalTime 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime now = LocalTime.now();
String localTime = df.format(now);
System.out.println(localTime);
--输出
21:37:09
// String 转 LocalTime
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime ldt = LocalTime.parse("21:11:01", df);
System.out.println(ldt);
--输出
21:11:01
String 与 LocalDateTime相互转换
// LocalTimeDate 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
String localTime = df.format(now);
System.out.println(localTime);
--输出
2021-11-21 20:56:01
//String 转 LocalTimeDate
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //这里不能用yyyy-MM-dd
LocalDateTime ldt = LocalDateTime.parse("2017-09-28 23:11:11", df);
System.out.println(ldt);
--输出
2017-09-28T23:11:11
Date 与 LocalDate相互转换
//LocalDate转Date
LocalDate localDate = LocalDate.now();
ZoneId zoneId = ZoneId.systemDefault();
Date date = Date.from(localDate.atStartOfDay().atZone(zoneId).toInstant());
System.out.println(date);
--输出:
Sun Nov 21 00:00:00 CST 2021
//Date转LocalDate
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = date.toInstant().atZone(zoneId).toLocalDate();
System.out.println(localDate);
--输出:
2021-11-21
Date 与 LocalTime 转换
//Date转LocalTime
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalTime localTime = date.toInstant().atZone(zoneId).toLocalTime();
System.out.println(localTime);
--输出:
21:41:31.140
Date 与 LocalDateTime相互转换
// LocalDateTime转Date
在LocalDateTime 转 Date 时,需要使用到 Java 8的几个类
ZoneId/ZoneOffset:表示时区
ZonedDateTime: 表示特定时区的日期和时间
Instant:表示时刻,不直接对应年月日信息,需要通过时区转换
LocalDateTime localDateTime = LocalDateTime.now();
//获取系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
//时区的日期和时间
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
//获取时刻
Date date = Date.from(zonedDateTime.toInstant());
System.out.println(date);
--输出
Sun Nov 21 21:25:20 CST 2021
// Date转LocalDateTime
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime();
System.out.println(localDateTime);
--输出
2021-11-21T21:27:10.717
LocalDate 与 LocalDateTime相互转换
// LocalDateTime转LocalDate
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();
ystem.out.println(localDate);
--输出:
2021-11-21
// LocalDate转LocalDateTime
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime1 = localDate.atStartOfDay();
LocalDateTime localDateTime2 = localDate.atTime(8,20,33);
LocalDateTime localDateTime3 = localDate.atTime(LocalTime.now());
System.out.println(localDateTime1);
System.out.println(localDateTime2);
System.out.println(localDateTime3);
--输出:
2021-11-21T00:00
2021-11-21T08:20:33
2021-11-21T21:31:07.340
LocalTime 与 LocalDateTime转换
// LocalDateTime转LocalTime
LocalDateTime localDateTime = LocalDateTime.now();
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);
--输出
21:43:05.884
LocalDateTime与Long转换
LocalDateTime 转 Long(毫秒时间戳)
ZoneId zone = ZoneId.systemDefault();
Instant instant = LocalDateTime.now().atZone(zone).toInstant();
System.out.println(instant.toEpochMilli());
--输出:
1640444452715
Long(毫秒时间戳) 转 LocalDateTime
Instant instant = Instant.ofEpochMilli(1640444137993L);
ZoneId zone = ZoneId.systemDefault();
System.out.println(LocalDateTime.ofInstant(instant, zone));
--输出:
2021-12-25T22:55:37.993