时间处理工具类分享
import org.apache.commons.lang.StringUtils;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
public class TimeUtil {
public static final String TYPE_1 = "yyyy-MM-dd HH:mm:ss";
public static final String TYPE_2 = "yyyy/MM/dd";
public static final String TYPE_3 = "yyyyMMdd";
public static final String TYPE_4 = "dd/MM/yyyy";
public static final String TYPE_5 = "yyyy-MM-dd";
public static final String TYPE_6 = "dd/MM/yyyy";
public static final String TYPE_7 = "dd-MM-yy";
public static final String TYPE_8 = "yyyy-MM";
public static final String TYPE_9 = "yyyy年MM月dd日";
public static final String TYPE_10 = "yyyyMMddHHmmssSSS";
public static final String TYPE_11 = "yyyyMMddHHmmss";
public static final String TYPE_13 = "HH:mm:ss";
public static final long DAY_MILLS = 1000 * 60 * 60 * 24L;
public static final Double DAY_MILLS_DOUBLE = 1000 * 60 * 60 * 24.0;
public static final long HOUR_MILLS = 1000 * 60 * 60L;
public static final long MONTH_MILLS = 30 * 24 * 1000 * 60 * 60L;
public static String timeFormat(Long time, String formatTime) {
if (Objects.isNull(time)) {
return null;
}
DateFormat sdf = new SimpleDateFormat(formatTime);
return sdf.format(time);
}
public static String timeStandardFormat(Long time) {
DateFormat sdf = new SimpleDateFormat(TYPE_1);
return sdf.format(time);
}
public static long parseTimeStr(String timeStr, String formatTime) {
DateFormat sdf = new SimpleDateFormat(formatTime);
try {
return sdf.parse(timeStr).getTime();
} catch (ParseException e) {
throw new ServiceException("parse timeStr failed! error msg is {}" + e.getMessage());
}
}
public static long getTimeBeforeDays(int days) {
int beforeDay = -days;
LocalDateTime localDateTime = LocalDateTime.now().plusDays(beforeDay);
return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
public static long getMillTimeAfterDays(long startTime, int days) {
return startTime + days * DAY_MILLS;
}
public static long getMillTimeBeforeDays(long startTime, long days) {
return startTime - days * DAY_MILLS;
}
public static long getMillTimeAfterHours(long startTime, int hours) {
return startTime + hours * HOUR_MILLS;
}
public static long timeParse(String timeStr, String formatTime) {
DateFormat sdf = new SimpleDateFormat(formatTime);
try {
return sdf.parse(timeStr).getTime();
} catch (ParseException e) {
throw new ServiceException("parse timeStr failed! error msg is {}" + e.getMessage());
}
}
public static long dateFormatMillTime(String timeStr) {
long time = timeParse(timeStr, TYPE_2);
return getMillTimeAfterDays(time, 1);
}
public static Long tomorrowZeroTime() {
return getZeroTime(1);
}
public static Long todayZeroTime() {
return getZeroTime(0);
}
public static Timestamp todayZeroTimestamp() {
return new Timestamp(getZeroTime(0));
}
public static Timestamp tomorrowZeroTimestamp() {
return new Timestamp(getZeroTime(1));
}
public static Long todayZeroTimeMillisThirteen() {
return new Timestamp(getZeroTime(0)).getTime();
}
public static Long todayZeroTimeMillis() {
return new Timestamp(getZeroTime(0)).getTime() / 1000;
}
public static Long getZeroTime(int days) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
calendar.add(Calendar.DAY_OF_MONTH, days);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTimeInMillis();
}
public static Timestamp getZeroTimestamp(int days) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
calendar.add(Calendar.DAY_OF_MONTH, days);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return new Timestamp(calendar.getTimeInMillis());
}
public static Timestamp getOneSecondLater(Timestamp timestamp) {
if (Objects.isNull(timestamp)) {
return null;
}
return new Timestamp(timestamp.getTime() + 1000L);
}
public static Long thisMonthBeginTimestamp() {
return initMonthBeginTimestamp(0);
}
public static Long lastMonthBeginTimestamp() {
return initMonthBeginTimestamp(-1);
}
public static Long initMonthBeginTimestamp(int months) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
calendar.add(Calendar.MONTH, months);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
public static String timeFormatWithType1(Long time) {
return timeFormat(time, TYPE_1);
}
public static String timeFormatWithType2(Long time) {
return timeFormat(time, TYPE_2);
}
public static String timeFormatWithType3(Long time) {
return timeFormat(time, TYPE_3);
}
public static String timeFormatWithType4(Long time) {
return timeFormat(time, TYPE_4);
}
public static String timeFormatWithType5(Long time) {
return timeFormat(time, TYPE_5);
}
public static String timeFormatWithType6(Long time) {
return timeFormat(time, TYPE_6);
}
public static String timeFormatWithType7(Long time) {
return timeFormat(time, TYPE_7);
}
public static String timeFormatWithType8(Long time) {
return timeFormat(time, TYPE_8);
}
public static String timeFormatWithType9(Long time) {
return timeFormat(time, TYPE_9);
}
public static String timeFormatWithType10(Long time) {
return timeFormat(time, TYPE_10);
}
public static String timeFormatWithType11(Long time) {
return timeFormat(time, TYPE_11);
}
public static String timeFormatWithType13(Long time) {
return timeFormat(time, TYPE_13);
}
public static Long parseTimeStrWithType1(String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return null;
}
return parseTimeStr(timeStr, TYPE_1);
}
public static Long parseTimeStrWithType4(String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return null;
}
return parseTimeStr(timeStr, TYPE_4);
}
public static Long parseTimeStrWithType5(String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return null;
}
return parseTimeStr(timeStr, TYPE_5);
}
public static Timestamp parseTimestampWithType1(String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return null;
}
try {
return new Timestamp(parseTimeStr(timeStr, TYPE_1));
} catch (Exception e) {
return null;
}
}
public static LocalDateTime getLocalDateTime(long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp);
ZoneId zoneId = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zoneId);
}
public static Long getTimestamp(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
return localDateTime.atZone(zoneId).toInstant().toEpochMilli();
}
private static Long getMonthFirstDate(Long time) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(time));
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
public static List<String> getDayFormatList(Long beginTime, Long endTime) {
List<String> result = new ArrayList<>();
Long time = beginTime;
while (time <= endTime) {
result.add(timeFormatWithType5(time));
time = getMillTimeAfterDays(time, 1);
}
return result;
}
public static List<String> getMonthFormatList(Long beginTime, Long endTime) {
List<String> result = new ArrayList<>();
Long time = beginTime;
while (time <= endTime) {
result.add(timeFormatWithType8(time));
time = getMonthFirstDate(time);
}
return result;
}
public static Long getDayZeroTimeMillisThirteen(Long time) {
String timeZone = "GMT+8:00";
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(time);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTimeInMillis();
}
public static Long getDayZeroTimeMillis(Long time) {
return getDayZeroTimeMillisThirteen(time) / 1000;
}
public static Long getDayEndTimeMillis(Long time) {
String timeZone = "GMT+8:00";
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
calendar.setTimeInMillis(time);
calendar.add(Calendar.YEAR, 0);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTimeInMillis();
}
public static String formatToFormat(LocalDateTime createTime) {
Long timestamp = getTimestamp(createTime);
return timeFormatWithType9(timestamp);
}
public static Boolean isValidDateOfType5(String dateString) {
if (StringUtils.isBlank(dateString)) {
return Boolean.FALSE;
}
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(TYPE_5);
try {
LocalDate.parse(dateString, FORMATTER);
return Boolean.TRUE;
} catch (DateTimeParseException e) {
return Boolean.FALSE;
}
}
public static Boolean isValidTimeOfType13(String timeString) {
if (StringUtils.isBlank(timeString)) {
return Boolean.FALSE;
}
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(TYPE_13);
try {
LocalTime.parse(timeString, FORMATTER);
return Boolean.TRUE;
} catch (DateTimeParseException e) {
return Boolean.FALSE;
}
}
public static String getNearestHalfHour() {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(TYPE_13);
LocalDateTime nearestHalfHour = getNearestHalfHour(now);
return nearestHalfHour.format(formatter);
}
public static LocalDateTime getNearestHalfHour(LocalDateTime time) {
LocalDateTime result = time.truncatedTo(ChronoUnit.MINUTES);
int minute = result.getMinute();
if (minute >= 30) {
result = result.withMinute(30);
} else {
result = result.withMinute(0);
}
return result;
}
public static Timestamp getNextWeekdayTimestamp(int dayOfWeek) {
return getNextWeekdayTimestamp(DayOfWeek.of(dayOfWeek));
}
public static Timestamp getNextWeekdayTimestamp(DayOfWeek dayOfWeek) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime todayMidnight = now.truncatedTo(ChronoUnit.DAYS);
LocalDateTime next = todayMidnight.with(TemporalAdjusters.nextOrSame(dayOfWeek));
if (next.isEqual(todayMidnight)) {
next = todayMidnight.with(TemporalAdjusters.next(dayOfWeek));
}
return Timestamp.valueOf(next);
}
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:" + now);
System.out.println("情况一的结果:" + getNextWeekdayTimestampWithTime(DayOfWeek.of(2), "12:00:00"));
System.out.println("情况二的结果:" + getNextWeekdayTimestampWithTime(DayOfWeek.of(2), "09:00:00"));
}
public static Timestamp getNextWeekdayTimestampWithTime(int dayOfWeek, String timeString) {
return getNextWeekdayTimestampWithTime(DayOfWeek.of(dayOfWeek), timeString);
}
public static Timestamp getNextWeekdayTimestampWithTime(DayOfWeek dayOfWeek, String timeString) {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(TYPE_13);
LocalTime specificTime = LocalTime.parse(timeString, timeFormatter);
LocalTime nowTime = now.toLocalTime();
if (now.getDayOfWeek() == dayOfWeek && nowTime.isBefore(specificTime)) {
LocalDateTime resultToday = now.with(specificTime);
return Timestamp.valueOf(resultToday);
} else {
LocalDateTime nextWeekday = now.with(TemporalAdjusters.next(dayOfWeek)).truncatedTo(ChronoUnit.DAYS).with(specificTime);
return Timestamp.valueOf(nextWeekday);
}
}
}