目录
获取当前时间
System.out.println("当前时间(到日-2022-10-21):"+ LocalDate.now());
System.out.println("当前时间(时分秒.3位毫秒-17:48:24.631):"+ LocalTime.now());
System.out.println("当前时间(时分秒.3位毫秒,T分割-2022-10-21T17:48:24.632):"+ LocalDateTime.now());
时间转化
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("年月日时分秒2日:"+ dateTime.toLocalDate());
System.out.println("年月日时分秒2时分秒.3位毫秒:"+ dateTime.toLocalTime());
创建指定的日期和时间
// 2023-12-12
LocalDate date = LocalDate.of(2023, 12, 12);
int year = date.getYear();
// 有数字和DECEMBER
Month month = date.getMonth();
date.getDayOfMonth();
// 23:59:59
LocalTime time = LocalTime.of(22, 59, 59);
// of可以传各种参数
LocalDateTime dateTime = LocalDateTime.of(2022, 12, 30, 1, 59, 59);
// LocalDate+LocalTime:2023-12-12T22:59:59(.toString()也是这个格式)
LocalDateTime dateTime = LocalDateTime.of(date, time);
字符串转时间
LocalDateTime dt = LocalDateTime.parse("2019-11-19T15:16:17");
LocalDate d = LocalDate.parse("2019-11-19");
LocalTime t = LocalTime.parse("15:16:17");
ISO 8601日期格式
注意:ISO 8601规定的日期和时间分隔符是T。标准格式如下:
日期:yyyy-MM-dd
时间:HH:mm:ss
带毫秒的时间:HH:mm:ss.SSS
日期和时间:yyyy-MM-dd'T'HH:mm:ss
带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS
按自己的格式互转(字符2日期)
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// LocalDateTime按照指定格式转字符(秒==LocalDateTime,日==LocalDate)
String str = pattern.format(LocalDateTime.now());
// 指定格式的时间字符转日期
LocalDateTime dt2 = LocalDateTime.parse("2020-10-20 15:16:17", pattern);
System.out.println("字符转指定时间格式:"+dt2);
// 字符转日期(可截取保留日)
// 字符串和格式类模板必须一致
LocalDate dt3 = LocalDate.parse("2020-10-20 15:16:17", pattern);
// 会报错 "yyyy-MM-dd HH:mm:ss" 无法转 年月日
LocalDate dt4 = LocalDate.parse("2020-10-20", pattern);
时间加减计算
参数为负数则减
-
方式一
LocalDateTime plusYearsResult = localDateTime.plusYears(2L);
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L);
LocalDateTime plusDaysResult = localDateTime.plusDays(7L);
LocalDateTime plusHoursResult = localDateTime.plusHours(2L);
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L);
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L); -
方式二
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
指定时间
LocalDate localDate = LocalDate.now();
//当前时间基础上,指定本年当中的第几天,取值范围为1-365,366
LocalDate withDayOfYearResult = localDate.withDayOfYear(200);
//当前时间基础上,指定本月当中的第几天,取值范围为1-29,30,31
LocalDate withDayOfMonthResult = localDate.withDayOfMonth(5);
//当前时间基础上,直接指定年份
LocalDate withYearResult = localDate.withYear(2017);
//当前时间基础上,直接指定月份
// 调整月份时,会相应地调整日期,即把2019-10-31的月份调整为2时,日期也自动变为28或29
LocalDate withMonthResult = localDate.withMonth(5);
LocalTime localTime = LocalTime.now();
//当前时间基础上,直接指定小时
LocalTime withHourResult = localTime.withHour(1);
//当前时间基础上,直接指定分钟
LocalTime withMinuteResult = localTime.withMinute(15);
//当前时间基础上,直接指定秒
LocalTime withSecondResult = localTime.withSecond(20);
实用方法
// 本月第一天0:00时刻:
LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
// 今天0:00
LocalDateTime atStartOfDay = LocalDate.now().atStartOfDay();
// 今天的最后一秒
LocalDateTime time = LocalDate.now().plusDays(1L).atStartOfDay().plusSeconds(-1L);
// 昨天的0:00
LocalDateTime yesterDay = LocalDate.now().plusDays(-1L).atStartOfDay();
// 本月最后1天:
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
// 下月第1天:
LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
// 本月第1个周一:
LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
- 获取某一天,正负n天的最后一秒(23:59:59)
点击查看代码
/**
*
* @param day 日期
* @param num 加减天数 -n,0,n
* @return null 或 格式 2022-10-21T23:59:59
*/
public static LocalDateTime getDateLastTime(LocalDate day, long num){
if (null == day) {
return null;
}
return day.plusDays(1L).atStartOfDay().plusSeconds(-1L);
}
- 获取某一天,正负n天的0:00
点击查看代码
/**
* 获取某一天,正负n天的0:00(没有秒)
* @param day 日期
* @param num 加减天数 -n,0,n
* @return 格式 2022-10-21T00:00
*/
public static LocalDateTime getDateAtStartTime(LocalDate day, long num){
if (null == day) {
return null;
}
return day.plusDays(num).atStartOfDay();
}
- 获取某一天,正负n天的最后一秒(23:59:59)字符串
点击查看代码
/**
* 获取某一天,正负n天的最后一秒字符(23:59:59)
* @param day
* @param num
* @param patternStr 时间格式 (null默认 yyyy-MM-dd HH:mm:ss)
* @return
*/
public static String getDateLastTimeStr(LocalDate day, long num, String patternStr){
LocalDateTime time = getDateLastTime(day, num);
if (time == null) {
return "";
}
String patternStr2 = "yyyy-MM-dd HH:mm:ss";
if (patternStr != null && !patternStr.isEmpty()) {
patternStr2 = patternStr;
}
DateTimeFormatter pattern = DateTimeFormatter.ofPattern(patternStr2);
return pattern.format(time);
}
- 获取某一天,正负n天的00:00:00字符
点击查看代码
/**
* 获取某一天,正负n天的00:00:00字符
* @param day
* @param num
* @param patternStr 日期格式(null 默认"yyyy-MM-dd HH:mm:ss" )
* @return "" 或 "yyyy-MM-dd HH:mm:ss" 或 patternStr格式
*/
public static String getDateAtStartTimeStr(LocalDate day, long num, String patternStr){
LocalDateTime time = getDateAtStartTime(day, num);
if (time == null) {
return "";
}
String patternStr2 = "yyyy-MM-dd HH:mm:ss";
if (patternStr != null && !patternStr.isEmpty()) {
patternStr2 = patternStr;
}
DateTimeFormatter pattern = DateTimeFormatter.ofPattern(patternStr2);
return pattern.format(time);
}
计算时间间隔
//计算两个日期的日期间隔-年月日
LocalDate date1 = LocalDate.of(2020, 10, 21);
LocalDate date2 = LocalDate.of(2019, 9, 11);
//内部是用date2-date1,所以得到的结果是负数
Period period = Period.between(date1, date2);
System.out.println("相差年数 : " + period.getYears());
System.out.println("相差月数 : " + period.getMonths());
System.out.println("相差日数 : " + period.getDays());
//另一种计算方式和表现形式
System.out.println("-------------------------------");
long years = period.get(ChronoUnit.YEARS);
long months = period.get(ChronoUnit.MONTHS);
long days = period.get(ChronoUnit.DAYS);
System.out.println("相差的年月日分别为 : " + years + "," + months + "," + days);
获取几年几个月几日几时几分
并没有获得秒差,没有该方法,不过可以通过毫秒换算
//计算两个时间的间隔
System.out.println("-------------------------------");
LocalDateTime date3 = LocalDateTime.now();
LocalDateTime date4 = LocalDateTime.of(2018, 1, 13, 22, 30, 10);
Duration duration = Duration.between(date3, date4);
System.out.println(date3 + " 与 " + date4 + " 间隔 " + "\n"
+ " 天 :" + duration.toDays() + "\n"
+ " 时 :" + duration.toHours() + "\n"
+ " 分 :" + duration.toMinutes() + "\n"
+ " 毫秒 :" + duration.toMillis() + "\n"
+ " 纳秒 :" + duration.toNanos() + "\n"
);
2个时间比较
isBefore
isAfter
// 今天0:00
LocalDate now = LocalDate.now();
LocalDateTime atStartOfDay = now.atStartOfDay();
// 今天的最后一秒
LocalDateTime lastTime = LocalDate.now().plusDays(1L).atStartOfDay().plusSeconds(-1L);
System.out.println("LocalDate当前时间小于3天后:"+now.isBefore(now.plusDays(3)));
System.out.println("LocalDateTime,0点大于今天最后一秒:"+atStartOfDay.isAfter(lastTime));