2024年08月26日
LocalDate 类和 Date 类都是用于处理日期的类,其中LocalData是Java 8 引入的日期时间类,其中还同时引入了LocalTime、LocalDateTime。
2024年08月26日
将一个包含LocalDateTime对象的集合进行序列化和反序列化时,可能会遇到以下异常:
2024年08月26日
TemporalAdjusters与TemporalAdjuster的作用在于提供了一种统一的、类型安全的方式来处理日期时间的操作。在过去的版本中,Java的日期时间API主要依赖于Calendar类,但这个类在处理复杂的日期时间操作时显得不够灵活和类型安全。TemporalAdjusters的出现弥补了这一缺陷,使得日期时间操作更加简洁、易用和类型安全。
2024年08月26日
LocalDate为日期,前端如果传日期要用此对象接收。
LocalDateTime为日期时间,前端如果传日期时间要用此对象接收。
如果是前端传过来的一般为字符串,所以需要在属性上添加解析注解,否则直接接收会出现转换错误
2024年08月26日
// 代码
@Test
public void now(){
LocalDate localDate = LocalDate.now();
log.info("日期:"+ localDate);
LocalTime localTime = LocalTime.now();
log.info("时间:"+ localTime);
LocalDateTime localDateTime = LocalDateTime.now();
log.info("日期时间:"+ localDateTime);
}
// 输出
INFO - 日期:2023-09-05
INFO - 时间:22:28:21.994
INFO - 日期时间:2023-09-05T22:28:21.994
2024年08月26日
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
/**
* @author javawency
* @description: 时间工具类
**/
public class Date2Utils {
/**
* 时间对象转字符串
*
* @param date
* @return
* @throws ParseException
*/
public static String dateToStr(Date date) {
SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
return format.format(date);
}
/**
* 时间对象转字符串
*
* @param date
* @param pattern
* @return
* @throws ParseException
*/
public static String dateToStr(Date date, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 字符串转时间对象
*
* @param dateStr
* @return
* @throws ParseException
*/
public static Date strToDate(String dateStr) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
Date date = format.parse(dateStr);
return date;
}
/**
* 字符串转时间对象
*
* @param dateStr
* @param pattern
* @return
* @throws ParseException
*/
public static Date strToDate(String dateStr, String pattern) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date date = format.parse(dateStr);
return date;
}
/**
* 获取两个日期相差的天数
*
* @param date 开始时间
* @param endDate 结束时间
* @return 返回相差天数
* @throws ParseException
*/
public static long getBetweenDay(Date date, Date endDate) throws ParseException {
SimpleDateFormat dfs = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
String dateStr = dfs.format(date);
String endDateStr = dfs.format(endDate);
Date parseDate = dfs.parse(dateStr);
Date parseEndDate = dfs.parse(endDateStr);
long day = DateUtil.between(parseDate, parseEndDate, DateUnit.DAY);
return day;
}
/**
* 今天的开始时间
*
* @return yyyy-MM-dd 00:00:00
*/
public static String dayStart() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
String dayStartStr = todayStart.format(dateTimeFormatter);
return dayStartStr;
}
/**
* 今天的结束时间
*
* @return yyyy-MM-dd 23:59:59
*/
public static String dayEnd() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime dayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
String dayEndStr = dayEnd.format(dateTimeFormatter);
return dayEndStr;
}
/**
* 本周开始时间
*
* @return yyyy-MM-dd 00:00:00
*/
public static String weekStart() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
TemporalAdjuster firstWeek = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
String weekStart = localDateTime.with(firstWeek).format(dateTimeFormatter);
return weekStart;
}
/**
* 本周结束时间
*
* @return yyyy-MM-dd 23:59:59
*/
public static String weekEnd() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
TemporalAdjuster lastWeek = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
String weekEnd = todayEnd.with(lastWeek).format(dateTimeFormatter);
return weekEnd;
}
/**
* 本月开始时间
*
* @return yyyy-MM-dd 00:00:00
*/
public static String monthStart() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = LocalDate.of(localDateTime.getYear(), localDateTime.getMonth(), 1);
String monthStart = LocalDateTime.of(localDate, LocalTime.MIN).format(dateTimeFormatter);
return monthStart;
}
/**
* 本月结束时间
*
* @return yyyy-MM-dd 23:59:59
*/
public static String monthEnd() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime todayEnd = LocalDateTime.now();
LocalDateTime with = todayEnd.with(TemporalAdjusters.lastDayOfMonth());
LocalDateTime localDateTime = LocalDateTime.of(with.toLocalDate(), LocalTime.MAX);
String monthEnd = localDateTime.format(dateTimeFormatter);
return monthEnd;
}
/**
* 今年开始时间
*
* @return yyyy-MM-dd 00:00:00
*/
public static String yearStart() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = LocalDate.of(localDateTime.getYear(), 1, 1);
String yearStart = LocalDateTime.of(localDate, LocalTime.MIN).format(dateTimeFormatter);
return yearStart;
}
/**
* 今年结束时间
*
* @return yyyy-MM-dd 23:59:59
*/
public static String yearEnd() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
LocalDateTime todayEnd = LocalDateTime.now();
LocalDateTime with = todayEnd.with(TemporalAdjusters.lastDayOfYear());
LocalDateTime localDateTime = LocalDateTime.of(with.toLocalDate(), LocalTime.MAX);
String yearEnd = localDateTime.format(dateTimeFormatter);
return yearEnd;
}
/**
* 重置秒
*
* @param date
* @param second
* @return
*/
public static Date resetSecond(Date date, int second) {
if (second < 0 || second > 59) {
return date;
}
LocalDateTime localDate = dateToLocalDateTime(date);
localDate = localDate.withSecond(second);
Date newDate = localDateTimeToDate(localDate);
return newDate;
}
/**
* 重置秒
*
* @param dateStr
* @param second
* @return
* @throws ParseException
*/
public static Date resetSecond(String dateStr, int second) throws ParseException {
if (second < 0 || second > 59) {
return strToDate(dateStr);
}
Date date = strToDate(dateStr);
LocalDateTime localDate = dateToLocalDateTime(date);
localDate = localDate.withSecond(second);
Date newDate = localDateTimeToDate(localDate);
return newDate;
}
public static Date localDateToDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
public static LocalDate dateToLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalDate localDate = localDateTime.toLocalDate();
return localDate;
}
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
public static LocalDateTime dateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime;
}
/**
* 判断两个时间是否相等
*
* @param date
* @param date2
* @return
*/
public static boolean equal(Date date, Date date2) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime localDateTime2 = dateToLocalDateTime(date2);
return localDateTime.isEqual(localDateTime2);
}
/**
* 判断date 日期是否小于date2
*
* @param date
* @param date2
* @return
*/
public static boolean after(Date date, Date date2) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime localDateTime2 = dateToLocalDateTime(date2);
return localDateTime.isAfter(localDateTime2);
}
/**
* 比较日期相差多少天
*
* @param date
* @param date2
* @return
*/
public static int differenceDays(Date date, Date date2) {
LocalDate localDateTime = dateToLocalDate(date);
LocalDate localDateTime2 = dateToLocalDate(date2);
Period period = Period.between(localDateTime, localDateTime2);
return period.getDays();
}
public static int differenceDays(LocalDate localDate, LocalDate localDate2) {
Period period = Period.between(localDate, localDate2);
return period.getDays();
}
}
2024年08月26日
作者 | Java圣斗士 | 原创文章,转载请注明出处
全文4000字,阅读大约需要15分钟,建议收藏
小花:Hey,Morty。最近正在准备面试,你说Java8 的新特性会不会考到呢?