import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.*;
public class DateUtils {
public static final String DATE_PATTERN = "yyyy-MM-dd";
public final static String DATE_YM_PATTERN = "yyyyMM";
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 字符串转换成日期
* @param date 字符串格式日期
* @param pattern 格式
* @return LocalDate格式日期
*/
public static LocalDate parseDate(String date, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDate.parse(date, formatter);
}
/**
* 字符串转换成LocalDateTime
* @param dateTime 字符串格式日期时间
* @param pattern 格式
* @return LocalDateTime格式日期时间
*/
public static LocalDateTime parseDateTime(String dateTime, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(dateTime, formatter);
}
/**
* 日期转换成字符串
* @param date 日期
* @param pattern 格式
* @return 字符串格式日期时间
*/
public static String parseString(LocalDate date, String pattern) {
if (Objects.isNull(date)) {
return "";
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return formatter.format(date);
}
/**
* 字符串转换成LocalDateTime
* @param dateTime 日期时间
* @param pattern 格式
* @return 字符串格式日期时间
*/
public static String parseString(LocalDateTime dateTime, String pattern) {
if (Objects.isNull(dateTime)) {
return "";
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return formatter.format(dateTime);
}
/**
* 转换成时间戳(毫秒)
* @param dateTime LocalDateTime日期
* @return
*/
public static Long toMillisecond(LocalDateTime dateTime) {
return dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 转换成时间戳(毫秒)
* @param date LocalDate日期
* @return
*/
public static Long toMillisecond(LocalDate date) {
LocalDateTime dateTime = date.atStartOfDay();
return dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 计算两日期时间差
* @param date startDate 开始日期
* @param date endDate 结束日期
* @return
*/
public static Long calculateActualDays(LocalDate startDate, LocalDate endDate) {
return endDate.toEpochDay() - startDate.toEpochDay() + 1;
}
/**
* 计算月份差
* @param date yearMonth 月份
* @return
*/
public static Long calculateActualDays(String yearMonth) {
String firstDay = getFirstDayOfMonth(yearMonth);
String lastDay = getLastDayOfMonth(yearMonth);
LocalDate startDate = parseDate(firstDay, DATE_PATTERN);
LocalDate endDate= parseDate(lastDay , DATE_PATTERN);
return endDate.toEpochDay() - startDate.toEpochDay() + 1;
}
/**
* 根据日期获取月份第一天
* @param yearMonth yyyyMM/yyyy-MM 格式字符串
* @return
*/
public static String getFirstDayOfMonth(String yearMonth) {
if(!yearMonth.contains("-")){
yearMonth = yearMonth.substring(0, 4) + "-" + yearMonth.substring(4, 6);
}
return yearMonth + "-01";
}
/**
* 根据日期获取月份第一天
* @param date LocalDate日期
* @return
*/
public static LocalDate getFirstDayOfMonth(LocalDate date) {
return date.with(TemporalAdjusters.firstDayOfMonth());
}
/**
* 获取月份最后一天
* @param yearMonth yyyyMM/yyyy-MM格式字符串
* @return
*/
public static String getLastDayOfMonth(String yearMonth) {
String firstDay = getFirstDayOfMonth(yearMonth);
LocalDate localDate = parseDate(firstDay, DATE_PATTERN);
String lastDay = parseString(getLastDayOfMonth(localDate), DATE_PATTERN);
return lastDay;
}
/**
* 根据日期获取月份最后一天
* @param date LocalDate日期
* @return
*/
public static LocalDate getLastDayOfMonth(LocalDate date) {
return date.with(TemporalAdjusters.lastDayOfMonth());
}
/**
* 根据日期获取所在日期的年周
* @param date 日期 yyyy-MM-dd
* @return yyyyww
*/
public static String getWeekDateOfDay(String date){
LocalDate localDate = LocalDate.parse(date);
int year = localDate.get(WeekFields.ISO.weekBasedYear());
int week = localDate.get(WeekFields.ISO.weekOfWeekBasedYear());
String weekDate = week>=10 ? year + "" + week : year + "0" + week;
return weekDate;
}
/**
* 根据日期获取所在日期的年周
* @param date LocalDate日期
* @return yyyyww
*/
public static String getWeekDateOfDay(LocalDate date){
int year = date.get(WeekFields.ISO.weekBasedYear());
int week = date.get(WeekFields.ISO.weekOfWeekBasedYear());
String weekDate = week>=10 ? year + "" + week : year + "0" + week;
return weekDate;
}
/**
* 根据年份和周数获取周一或者周日日期
* @param category 例如202101,代表2021年第一周
* @param newValue 1代表周一,2代表周二 ....7代表周日
* @return 日期 yyyy-MM-dd
*/
public static LocalDate getDayOfWeek(String category, long newValue){
int year = Integer.valueOf(category.substring(0,4));
int numWeek = Integer.valueOf(category.substring(4,6));
WeekFields weekFields= WeekFields.ISO;
LocalDate now = LocalDate.now();
LocalDate localDate = now.withYear(year).with(weekFields.weekOfYear(),numWeek);
LocalDate goalLocalDate = localDate.with(weekFields.dayOfWeek(), newValue);
return goalLocalDate;
}
/**
* 获取日期所属星期几
* @param localDate 日期
* @return 1,2.. (星期一,星期二...)
*/
public static Integer getWeekIndex(LocalDate localDate){
return localDate.getDayOfWeek().getValue();
}
【JAVA工具类】时间
于 2022-05-12 14:10:07 首次发布