All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.terapico.utils.DateTimeUtil Maven / Gradle / Ivy

package com.terapico.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class DateTimeUtil {
	/**
	 *
	 * 
    *
  • EarlierThan: 时间段1开始了,时间段2还没开始.
  • *
  • EndIn: 时间段1早于时间段2开始, 在时间段2期间结束.
  • *
  • Inside: 时间段1的开始和结束都在时间段2内.
  • *
  • StartIn: 时间段1在时间段2内开始,在时间段2结束后才结束.
  • *
  • After: 时间段1在时间段2结束后才开始.
  • *
  • Contains: 时间段1包含整个时间段2.
  • *
* @author clariones * */ public static enum DateRangeRelation { EarlierThan, // 时间段1开始了,时间段2还没开始 EndIn, // 时间段1早于时间段2开始, 在时间段2期间结束 Inside, // 时间段1的开始和结束都在时间段2内 StartIn, // 时间段1在时间段2内开始,在时间段2结束后才结束 After, // 时间段1在时间段2结束后才开始 Contains // 时间段1包含整个时间段2 } public static long SECOND_IN_MS = 1000L; public static long MINUTE_IN_MS = SECOND_IN_MS * 60; public static long HOUR_IN_MS = MINUTE_IN_MS * 60; public static long DAY_IN_MS = HOUR_IN_MS * 24; public static long WEEK_IN_MS = DAY_IN_MS * 7; public static final DateTimeFormatter DAY_FORMAT = DateTimeFormatter.ofPattern("yyyy-M-d"); public static final DateTimeFormatter DAY_FORMAT_BY_SLASH = DateTimeFormatter.ofPattern("yyyy/M/d"); public static final DateTimeFormatter DAY_TIME_MINUTE_FORMAT = DateTimeFormatter.ofPattern("yyyy-M-d H:m"); public static final DateTimeFormatter DAY_TIME_MINUTE_FORMAT_BY_SLASH = DateTimeFormatter.ofPattern("yyyy/M/d H:m"); public static final DateTimeFormatter DAY_TIME_MINUTE_FORMAT_S = DateTimeFormatter.ofPattern("yyyy-M-dd'T'H:m"); public static final DateTimeFormatter DAY_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-M-d H:m:s"); public static final DateTimeFormatter DAY_TIME_FORMAT_S = DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s"); public static final DateTimeFormatter DAY_TIME_FORMAT_SS = DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s.SSS'Z'"); public static final DateTimeFormatter YEAR_MONTH_FORMAT = DateTimeFormatter.ofPattern("yyyy-M"); public static final DateTimeFormatter YEAR_MONTH_FORMAT_BY_SLASH = DateTimeFormatter.ofPattern("yyyy/M"); public static final String HOUR_MINUTE_FORMAT = "H:m"; public static final String HOUR_MINUTE_SECOND_FORMAT = "H:m:s"; public static final String HOUR_MINUTE_SECOND_SS_FORMAT = "H:m:s.S"; public static final String DATE_HOUR_MINUTE_FORMAT = "yyyy-MM-dd HH:mm:ss"; private static final DateTimeFormatter[] allFormats = new DateTimeFormatter[] { DAY_FORMAT, DAY_TIME_FORMAT, DAY_TIME_FORMAT_S, DAY_TIME_MINUTE_FORMAT, DAY_TIME_MINUTE_FORMAT_S, DAY_TIME_FORMAT_SS, YEAR_MONTH_FORMAT, DAY_FORMAT_BY_SLASH, DAY_TIME_MINUTE_FORMAT_BY_SLASH, YEAR_MONTH_FORMAT_BY_SLASH}; private static final String[] timeFormats = new String[] {DATE_HOUR_MINUTE_FORMAT, HOUR_MINUTE_SECOND_SS_FORMAT , HOUR_MINUTE_SECOND_FORMAT, HOUR_MINUTE_FORMAT}; private static final Map ChinaHolidayPatch = new HashMap<>(); static { // 2019 年 ChinaHolidayPatch.put("2019-01-01", true); // 元旦 ChinaHolidayPatch.put("2019-02-02", false); ChinaHolidayPatch.put("2019-02-03", false); ChinaHolidayPatch.put("2019-02-04", true); // 春节 ChinaHolidayPatch.put("2019-02-05", true); ChinaHolidayPatch.put("2019-02-06", true); ChinaHolidayPatch.put("2019-02-07", true); ChinaHolidayPatch.put("2019-02-08", true); ChinaHolidayPatch.put("2019-04-05", true); // 清明 ChinaHolidayPatch.put("2019-04-28", false); ChinaHolidayPatch.put("2019-05-01", true); // 5.1 ChinaHolidayPatch.put("2019-05-02", true); ChinaHolidayPatch.put("2019-05-03", true); ChinaHolidayPatch.put("2019-05-05", false); ChinaHolidayPatch.put("2019-06-07", true); // 端午 ChinaHolidayPatch.put("2019-09-13", true); // 中秋 ChinaHolidayPatch.put("2019-09-29", false); ChinaHolidayPatch.put("2019-10-01", true); // 国庆 ChinaHolidayPatch.put("2019-10-02", true); ChinaHolidayPatch.put("2019-10-03", true); ChinaHolidayPatch.put("2019-10-04", true); ChinaHolidayPatch.put("2019-10-07", true); ChinaHolidayPatch.put("2019-10-12", false); // 2020年 ChinaHolidayPatch.put("2020-01-01", true); // 元旦 ChinaHolidayPatch.put("2020-01-19", false); // 春节 ChinaHolidayPatch.put("2020-01-24", true); ChinaHolidayPatch.put("2020-01-27", true); ChinaHolidayPatch.put("2020-01-28", true); ChinaHolidayPatch.put("2020-01-29", true); ChinaHolidayPatch.put("2020-01-30", true); ChinaHolidayPatch.put("2020-02-01", false); ChinaHolidayPatch.put("2020-04-06", true); // 清明 ChinaHolidayPatch.put("2020-05-01", true); // 5.1 ChinaHolidayPatch.put("2020-06-25", true); // 端午 ChinaHolidayPatch.put("2020-06-26", true); ChinaHolidayPatch.put("2020-06-28", false); ChinaHolidayPatch.put("2020-09-27", false); ChinaHolidayPatch.put("2020-10-01", true); // 国庆-中秋 ChinaHolidayPatch.put("2020-10-02", true); ChinaHolidayPatch.put("2020-10-05", true); ChinaHolidayPatch.put("2020-10-06", true); ChinaHolidayPatch.put("2020-10-07", true); ChinaHolidayPatch.put("2020-10-08", true); ChinaHolidayPatch.put("2020-10-10", false); // 2021年 ChinaHolidayPatch.put("2021-01-01", true); // 元旦 ChinaHolidayPatch.put("2021-02-07", false); // 春节调休 ChinaHolidayPatch.put("2021-02-11", true); ChinaHolidayPatch.put("2021-02-12", true); ChinaHolidayPatch.put("2021-02-15", true); ChinaHolidayPatch.put("2021-02-16", true); ChinaHolidayPatch.put("2021-02-17", true); ChinaHolidayPatch.put("2021-02-20", false); ChinaHolidayPatch.put("2021-04-05", true); // 清明 ChinaHolidayPatch.put("2021-04-25", false); // 5.1调休 ChinaHolidayPatch.put("2021-05-03", true); // 5.1 ChinaHolidayPatch.put("2021-05-04", true); ChinaHolidayPatch.put("2021-05-05", true); ChinaHolidayPatch.put("2021-05-08", false); ChinaHolidayPatch.put("2021-06-14", true); // 端午 ChinaHolidayPatch.put("2021-09-18", false); // 中秋 ChinaHolidayPatch.put("2021-09-20", true); ChinaHolidayPatch.put("2021-09-21", true); ChinaHolidayPatch.put("2021-09-26", false); // 中秋 ChinaHolidayPatch.put("2021-10-01", true); // 国庆-中秋 ChinaHolidayPatch.put("2021-10-04", true); ChinaHolidayPatch.put("2021-10-05", true); ChinaHolidayPatch.put("2021-10-06", true); ChinaHolidayPatch.put("2021-10-07", true); ChinaHolidayPatch.put("2021-10-09", false); } public static String toStringAsDay(Date date) { if (date == null) { return null; } return DateTimeFormatter.ISO_DATE.format(toLocalDateTime(date)); } public static Date parseInputDateTime(String valueOf) { if (valueOf == null) { return null; } if (valueOf.matches("\\d+")) { try { long tsInMs = Long.parseLong(valueOf); return new Date(tsInMs); } catch (Exception e) { } } for (DateTimeFormatter fmt : allFormats) { try { LocalDateTime temp = LocalDateTime.parse(valueOf, fmt); if (temp != null) { return toDate(temp); } } catch (Exception e) { } try { LocalDate tempDate = LocalDate.parse(valueOf, fmt); if (tempDate != null) { return toDate(tempDate.atStartOfDay()); } } catch (Exception e) { } } return null; } public static Date parseInputTime(String valueOf) { if (valueOf == null) { return null; } if (valueOf.matches("\\d+")) { try { long tsInMs = Long.parseLong(valueOf); return new Date(tsInMs); } catch (Exception e) { } } for (String fmt : timeFormats) { try { DateFormat sdf = new SimpleDateFormat(fmt); Date temp = sdf.parse(valueOf); if (temp != null) { return temp; } } catch (Exception e) { e.printStackTrace(); } } return null; } public static Date SetTimeInADay(Date date, int hour, int minute, int second) { Calendar cald = Calendar.getInstance(); cald.setTime(date); cald.set(Calendar.HOUR_OF_DAY, hour); cald.set(Calendar.MINUTE, minute); cald.set(Calendar.SECOND, second); return cald.getTime(); } public static Date addDays(Date date, int days, boolean byEndOfBoundary) { if (!byEndOfBoundary) { return standOn(date).addDays(days).getDate(); } if (days > 0) { // 如果是向后, 那么到 日尾 return standOn(date).addDays(days).endOfDay().getDate(); } return standOn(date).addDays(days).startOfDay().getDate(); } public static Date addHours(Date date, int hours) { return standOn(date).addHours(hours).getDate(); } public static Date addMinutes(Date date, int minutes) { return standOn(date).addMinutes(minutes).getDate(); } public static Date addSeconds(Date date, int seconds) { return standOn(date).addSeconds(seconds).getDate(); } public static Date addMS(Date date, long ms) { return new Date(date.getTime() + ms); } private static Date toDate(LocalDateTime input) { return Date.from(input.atZone(ZoneId.systemDefault()).toInstant()); } private static LocalDateTime toLocalDateTime(Date input) { if (input instanceof java.sql.Date) { return new Date(input.getTime()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); } return input.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); } public static Date toEndOfDay(Date date) { return SetTimeInADay(date, 23, 59, 59); } public static Date toStartOfDay(Date date) { return SetTimeInADay(date, 0, 0, 0); } public static int calcDifferDays(Date startDay, Date endDay) { LocalDateTime d1 = toLocalDateTime(startDay); LocalDateTime d2 = toLocalDateTime(endDay); Duration duration = Duration.between(d1, d2); return (int) duration.toDays(); } public static int calcDifferHours(Date startTime, Date endTime) { LocalDateTime d1 = toLocalDateTime(startTime); LocalDateTime d2 = toLocalDateTime(endTime); Duration duration = Duration.between(d1, d2); return (int) duration.toHours(); } public static int calcDifferMinutes(Date startTime, Date endTime) { LocalDateTime d1 = toLocalDateTime(startTime); LocalDateTime d2 = toLocalDateTime(endTime); Duration duration = Duration.between(d1, d2); return (int) duration.toMinutes(); } public static long calcDifferSeconds(Date startTime, Date endTime) { LocalDateTime d1 = toLocalDateTime(startTime); LocalDateTime d2 = toLocalDateTime(endTime); Duration duration = Duration.between(d1, d2); return duration.getSeconds(); } public static long calcDifferMS(Date startTime, Date endTime) { return endTime.getTime() - startTime.getTime(); } public static Date getDate(String dateString) { return parseInputDateTime(dateString); } public static Date addMonths(Date date, int months) { Date result = toDate(toLocalDateTime(date).plusMonths(months)); return result; } /** * use {@code DateTimeUtil.standOn(date).startOfMonth().getDate()} instead * @param date * @return */ @Deprecated public static Date toStartOfMonth(Date date) { return toStartOfDay(toDate(toLocalDateTime(date).with(TemporalAdjusters.firstDayOfMonth()))); } public static Date toEndOfLastMonth(Date date) { return toEndOfDay(toDate(toLocalDateTime(date).plusMonths(-1).with(TemporalAdjusters.lastDayOfMonth()))); } public static boolean isSameYear(Date date1, Date date2) { Calendar cald1 = Calendar.getInstance(); Calendar cald2 = Calendar.getInstance(); cald1.setTime(date1); cald2.setTime(date2); return cald1.get(Calendar.YEAR) == cald2.get(Calendar.YEAR); } public static boolean isSameMonth(Date date1, Date date2) { Calendar cald1 = Calendar.getInstance(); Calendar cald2 = Calendar.getInstance(); cald1.setTime(date1); cald2.setTime(date2); return cald1.get(Calendar.YEAR) == cald2.get(Calendar.YEAR) && cald1.get(Calendar.MONTH) == cald2.get(Calendar.MONTH); } public static boolean isSameDay(Date date1, Date date2) { Calendar cald1 = Calendar.getInstance(); Calendar cald2 = Calendar.getInstance(); cald1.setTime(date1); cald2.setTime(date2); return cald1.get(Calendar.YEAR) == cald2.get(Calendar.YEAR) && cald1.get(Calendar.MONTH) == cald2.get(Calendar.MONTH) && cald1.get(Calendar.DAY_OF_MONTH) == cald2.get(Calendar.DAY_OF_MONTH); } public static String formatDate(Date data, String format) { if (data == null) { return ""; } if (format == null) { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").format(data); } String result = CustomDateFormat(data, format); if (result != null) { return result; } return new SimpleDateFormat(format).format(data); } protected static String CustomDateFormat(Date data, String format) { if (format.equals("1_hour_or_earlier") || format.equals("1_day_or_earlier") || format.equals("fuzz_after_1_hour")) { LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault()); LocalDateTime registerTime = LocalDateTime.ofInstant(data.toInstant(), ZoneId.systemDefault()); if (now.minusHours(1L).isAfter(registerTime)) { Period period = Period.between(registerTime.toLocalDate(), now.toLocalDate()); int years = period.getYears(); if (years > 0) { return years + "年前"; } int months = period.getMonths(); if (months > 0) { return months + "个月前"; } long days = period.getDays(); if (days > 0L) { return days + "天前"; } Duration duration = Duration.between(registerTime, now); long hours = duration.toHours(); return hours + "小时前"; } return new SimpleDateFormat("HH:mm").format(data); } return null; } public static String formatDuration(long tsInMs, String format) { // 目前忽略format return formatMsToDefaultString(tsInMs); } private static String formatMsToDefaultString(long tsInMs) { if (tsInMs == 0) { return "0毫秒"; } String result = ""; long timeValue = Math.abs(tsInMs); String[] units = new String[] { "毫秒", "秒", "分钟", "小时", "天" }; long[] radis = new long[] { 1000L, 60L, 60L, 24L, Long.MAX_VALUE }; for (int i = 0; i < units.length; i++) { long valInCurRadix = timeValue % radis[i]; if (valInCurRadix == 0) { result = "零" + result; } else { result = String.valueOf(valInCurRadix) + units[i] + result; } timeValue = timeValue / radis[i]; if (timeValue == 0) { break; } } result = result.replaceAll("零+", "零"); result = result.replaceAll("零+$", ""); if (tsInMs < 0) { return "负" + result; } return result; } public static Date getDateBefore(long timeInMS) { Date result = toDate(LocalDateTime.now().minusSeconds(timeInMS/1000)); return result; } public static Date getFirstDayOfThisMonth() { return toStartOfMonth(new Date()); } public static boolean isChineseHoliday(Date date) { return isHoliday(ChinaHolidayPatch, date); } private static boolean isHoliday(Map holidayInfo, Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); String dayStr = String.format("%04d-%02d-%02d", c.get(Calendar.YEAR), c.get(Calendar.MONTH)+1, c.get(Calendar.DAY_OF_MONTH)); Boolean b = holidayInfo.get(dayStr); if (b!=null) { return b; } int d = c.get(Calendar.DAY_OF_WEEK); return d == Calendar.SATURDAY || d == Calendar.SUNDAY; } public static DateTimeBuilder standOn(Date date) { return new DateTimeBuilder(date); } public static DateTimeBuilder standOn(Date date, ZoneId zoneId) { return new DateTimeBuilder(date, zoneId); } public static DateRangeRelation compareDateRange(Date start1, Date end1, Date start2, Date end2) { if (end1.before(start1)) { Date t = start1; start1 = end1; end1 = t; } if (end2.before(start2)) { Date t = start2; start2 = end2; end1 = t; } if (start1.before(start2) && !end1.after(start2)) { return DateRangeRelation.EarlierThan; } if (!start1.after(start2) && !end1.before(end2)) { return DateRangeRelation.Contains; } if (!start1.after(start2) && end1.before(end2)) { return DateRangeRelation.EndIn; } if (start1.after(start2) && end1.before(end2)) { return DateRangeRelation.Inside; } if (start1.before(end2) && !end1.before(end2)) { return DateRangeRelation.StartIn; } if (!start1.before(end2) && end1.after(end2)) { return DateRangeRelation.After; } String message = String.format("cannot compare (%s,%s) with (%s,%s)", formatDate(start1, null), formatDate(end1, null), formatDate(start2, null), formatDate(end2, null)); throw new RuntimeException(message); } public static void main(String[] args) { System.out.print(parseInputTime("1:3")); // DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm"); // String date = "12:30"; // LocalDateTime dateTime = LocalDateTime.parse(date, format); // System.out.println(dateTime); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy