日期工具类
Posted liulsky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日期工具类相关的知识,希望对你有一定的参考价值。
package jm.tsc.tsirm.common.helper; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * @PACKAGE_NAME: jm.tsc.tsirm.common.helper * @NAME: DateUtils * @USER: liul * @TIME: 2022/10/27 10:30 * @DAY_NAME_SHORT: 周四 */ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 显示年月日时分秒,例如 2015-08-11 09:51:53. */ public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; /** * 仅显示年月日,例如 2015-08-11. */ public static final String DATE_PATTERN = "yyyy-MM-dd"; /** * 仅显示时分秒,例如 09:51:53. */ public static final String TIME_PATTERN = "HH:mm:ss"; /** * 显示年月日时分秒(无符号),例如 20150811095153. */ public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss"; /** * 仅显示年月日(无符号),例如 20150811. */ public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd"; /** * 春天; */ public static final Integer SPRING = 1; /** * 夏天; */ public static final Integer SUMMER = 2; /** * 秋天; */ public static final Integer AUTUMN = 3; /** * 冬天; */ public static final Integer WINTER = 4; /** * 星期日; */ public static final String SUNDAY = "星期日"; /** * 星期一; */ public static final String MONDAY = "星期一"; /** * 星期二; */ public static final String TUESDAY = "星期二"; /** * 星期三; */ public static final String WEDNESDAY = "星期三"; /** * 星期四; */ public static final String THURSDAY = "星期四"; /** * 星期五; */ public static final String FRIDAY = "星期五"; /** * 星期六; */ public static final String SATURDAY = "星期六"; /** * 年 */ private static final String YEAR = "year"; /** * 月 */ private static final String MONTH = "month"; /** * 周 */ private static final String WEEK = "week"; /** * 日 */ private static final String DAY = "day"; /** * 时 */ private static final String HOUR = "hour"; /** * 分 */ private static final String MINUTE = "minute"; /** * 秒 */ private static final String SECOND = "second"; /** * 获取当前日期和时间字符串. * * @return String 日期时间字符串,例如 2015-08-11 09:51:53 */ public static String getLocalDateTimeStr() return format(LocalDateTime.now(), DATETIME_PATTERN); /** * 获取系统当前时间戳 * * @return 1566889186583 */ public static String getSystemTime() String current = String.valueOf(System.currentTimeMillis()); return current; /** * 获取当前日期 yy-MM-dd * * @return 2019-08-27 */ public static String getLocalDateStr() Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(date); /** * 获取当前时间字符串. * * @return String 时间字符串,例如 09:51:53 */ public static String getLocalTimeStr() return format(LocalTime.now(), TIME_PATTERN); /** * 获取当前月份 */ public static int getNowMonth(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MONTH) + 1; /** * 获取当前日 */ public static int getNowDay(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DATE); /** * 获取当前年份 */ public static int getNowYear(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR); /** * 获取本月份的天数 */ public static int getNowDaysOfMonth() Calendar calendar = Calendar.getInstance(); return daysOfMonth(calendar.get(Calendar.YEAR), calendar.get(Calendar.DATE) + 1); /** * 获取指定月份的天数 * * @param year 年份 * @param month 月份 * @return 对应天数 */ public static int daysOfMonth(int year, int month) switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if ((year % 4 == 0 && year % 100 == 0) || year % 400 != 0) return 29; else return 28; default: return -1; /** * 获取当前星期字符串. * * @return String 当前星期字符串,例如 星期二 */ public static String getDayOfWeekStr() return format(LocalDate.now(), "E"); /** * 获取指定日期是星期几 * * @param localDate 日期 * @return String 星期几 */ public static String getDayOfWeekStr(LocalDate localDate) String[] weekOfDays = MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; int dayOfWeek = localDate.getDayOfWeek().getValue() - 1; return weekOfDays[dayOfWeek]; /** * 获取日期时间字符串 * * @param temporal 需要转化的日期时间 可传入LocalDate * @param pattern 时间格式 * @return String 日期时间字符串,例如 2015-08-11 09:51:53 */ public static String format(TemporalAccessor temporal, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return dateTimeFormatter.format(temporal); /** * 获取指定日期前一天 * * @return 2019-08-26 */ public static String getBeforeDay(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, -1); date = calendar.getTime(); return sdf.format(date); /** * 获取指定日期往前最近七天 * * @param date 指定时间 * @return */ public static String getServen(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, -7); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday; /** * 获取最近一个月 * * @param date 指定时间 * @return */ public static String getOneMonth(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, -1); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday; /** * 获取最近三个月 * * @param date 指定时间 * @return */ public static String getThreeMonth(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, -3); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday; /** * 获取最近一年 * * @param date 指定时间 * @return */ public static String getOneYear(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.YEAR, -1); Date start = c.getTime(); String startDay = sdf.format(start); return startDay; /** * 日期时间字符串转换为日期时间(java.time.LocalDateTime) * * @param localDateTimeStr 日期时间字符串 * @param pattern 日期时间格式 例如DATETIME_PATTERN * @return LocalDateTime 日期时间 */ public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter); /** * 日期字符串转换为日期(java.time.LocalDate) * * @param localDateStr 日期字符串 * @param pattern 日期格式 例如DATE_PATTERN * @return LocalDate 日期 */ public static LocalDate parseLocalDate(String localDateStr, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return LocalDate.parse(localDateStr, dateTimeFormatter); /** * 获取指定日期时间加上指定数量日期时间单位之后的日期时间. * * @param localDateTime 日期时间 * @param num 数量 * @param chronoUnit 日期时间单位 * @return LocalDateTime 新的日期时间 */ public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) return localDateTime.plus(num, chronoUnit); /** * 获取指定日期时间减去指定数量日期时间单位之后的日期时间. * * @param localDateTime 日期时间 * @param num 数量 * @param chronoUnit 日期时间单位 * @return LocalDateTime 新的日期时间 */ public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) return localDateTime.minus(num, chronoUnit); /** * 根据ChronoUnit计算两个日期时间之间相隔日期时间 * * @param start 开始日期时间 * @param end 结束日期时间 * @param chronoUnit 日期时间单位 * @return long 相隔日期时间 */ public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) return Math.abs(start.until(end, chronoUnit)); /** * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数 * * @param start 开始日期 * @param end 结束日期 * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS) * @return long 相隔年数或月数或天数 */ public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) return Math.abs(start.until(end, chronoUnit)); /** * 获取本年第一天的日期字符串 * * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfYearStr() return getFirstDayOfYearStr(LocalDateTime.now()); /** * 获取本年最后一天的日期字符串 * * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfYearStr() return getLastDayOfYearStr(LocalDateTime.now()); /** * 获取指定日期当年第一天的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfYearStr(LocalDateTime localDateTime) return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当年最后一天的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfYearStr(LocalDateTime localDateTime) return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当年第一天的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern); /** * 获取指定日期当年最后一天的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern); /** * 获取本月第一天的日期字符串 * * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfMonthStr() return getFirstDayOfMonthStr(LocalDateTime.now()); /** * 获取本月最后一天的日期字符串 * * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfMonthStr() return getLastDayOfMonthStr(LocalDateTime.now()); /** * 获取指定日期当月第一天的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当月最后一天的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfMonthStr(LocalDateTime localDateTime) return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当月第一天的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern); /** * 获取指定日期当月最后一天的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern); /** * 获取本周第一天的日期字符串 * * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfWeekStr() return getFirstDayOfWeekStr(LocalDateTime.now()); /** * 获取本周最后一天的日期字符串 * * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfWeekStr() return getLastDayOfWeekStr(LocalDateTime.now()); /** * 获取指定日期当周第一天的日期字符串,这里第一天为周一 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfWeekStr(LocalDateTime localDateTime) return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern); /** * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern); /** * 获取今天开始时间的日期字符串 * * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getStartTimeOfDayStr() return getStartTimeOfDayStr(LocalDateTime.now()); /** * 获取今天结束时间的日期字符串 * * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getEndTimeOfDayStr() return getEndTimeOfDayStr(LocalDateTime.now()); /** * 获取指定日期开始时间的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getStartTimeOfDayStr(LocalDateTime localDateTime) return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期结束时间的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getEndTimeOfDayStr(LocalDateTime localDateTime) return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN); /** * 获取指定日期开始时间的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd HH:mm:ss */ public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern); /** * 获取指定日期结束时间的日期字符串,带日期格式化参数 * * @param localDateTime 指定日期时间 * @param pattern 日期时间格式 * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern); public static String dayComparePrecise(Date fromDate, Date toDate) SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); if(fromDate==null||toDate==null) return "不足一个月"; Period period = Period.between(LocalDate.parse(format.format(fromDate)), LocalDate.parse(format.format(toDate))); StringBuffer sb = new StringBuffer(); if(period.getYears()>0) sb.append(period.getYears()).append("年"); if(period.getMonths()>0) sb.append(period.getMonths()).append("个月"); if(period.getYears()<=0&&period.getMonths()<=0) sb.append("不足一个月"); return sb.toString(); /** * Date转LocalDateTime类型 * localDateTime.toLocalDate(); * ocalDateTime.toLocalDate(); * * @param date 指定日期 * @return */ public static LocalDateTime dataToLocalDatetime(Date date) if(date==null) return null; Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); //Date转换为LocalDateTime LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); return localDateTime; /** * 切割日期。按照周期切割成小段日期段。例如: <br> * * @param startDate 开始日期(yyyy-MM-dd) * @param endDate 结束日期(yyyy-MM-dd) * @param period 周期(天,周,月,年) * @return 切割之后的日期集合 * <li>startDate="2019-02-28",endDate="2019-03-05",period="day"</li> * <li>结果为:[2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05]</li><br> * <li>startDate="2019-02-28",endDate="2019-03-25",period="week"</li> * <li>结果为:[2019-02-28,2019-03-06, 2019-03-07,2019-03-13, 2019-03-14,2019-03-20, * 2019-03-21,2019-03-25]</li><br> * <li>startDate="2019-02-28",endDate="2019-05-25",period="month"</li> * <li>结果为:[2019-02-28,2019-02-28, 2019-03-01,2019-03-31, 2019-04-01,2019-04-30, * 2019-05-01,2019-05-25]</li><br> * <li>startDate="2019-02-28",endDate="2020-05-25",period="year"</li> * <li>结果为:[2019-02-28,2019-12-31, 2020-01-01,2020-05-25]</li><br> */ public static List<String> listDateStrs(String startDate, String endDate, String period) List<String> result = new ArrayList<>(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN); LocalDate end = LocalDate.parse(endDate, dateTimeFormatter); LocalDate start = LocalDate.parse(startDate, dateTimeFormatter); LocalDate tmp = start; switch (period) case DAY: while (start.isBefore(end) || start.isEqual(end)) result.add(start.toString()); start = start.plusDays(1); break; case WEEK: while (tmp.isBefore(end) || tmp.isEqual(end)) if (tmp.plusDays(6).isAfter(end)) result.add(tmp.toString() + "," + end); else result.add(tmp.toString() + "," + tmp.plusDays(6)); tmp = tmp.plusDays(7); break; case MONTH: while (tmp.isBefore(end) || tmp.isEqual(end)) LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth()); if (lastDayOfMonth.isAfter(end)) result.add(tmp.toString() + "," + end); else result.add(tmp.toString() + "," + lastDayOfMonth); tmp = lastDayOfMonth.plusDays(1); break; case YEAR: while (tmp.isBefore(end) || tmp.isEqual(end)) LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear()); if (lastDayOfYear.isAfter(end)) result.add(tmp.toString() + "," + end); else result.add(tmp.toString() + "," + lastDayOfYear); tmp = lastDayOfYear.plusDays(1); break; default: break; return result; public static void main(String[] args) // System.out.println(getLocalDateTimeStr()); // System.out.println(getLocalDateStr()); // System.out.println(getSystemTime()); // System.out.println(getLocalTimeStr()); // System.out.println(getDayOfWeekStr()); // System.out.println(getDayOfWeekStr(LocalDate.now())); // // System.out.println("========"); // System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN)); // System.out.println("========"); // System.out.println(parseLocalDateTime("2020-12-13 11:14:12", DATETIME_PATTERN)); // System.out.println(parseLocalDate("2020-12-13", DATE_PATTERN)); // System.out.println("========"); // System.out.println(plus(LocalDateTime.now(), 3, ChronoUnit.HOURS)); // System.out.println(minus(LocalDateTime.now(), 4, ChronoUnit.DAYS)); // // System.out.println("========"); // System.out.println(getChronoUnitBetween(LocalDateTime.now(), parseLocalDateTime("2020-12-12 12:03:12", DATETIME_PATTERN), ChronoUnit.MINUTES)); // System.out.println(getChronoUnitBetween(LocalDate.now(), parseLocalDate("2021-12-12", DATE_PATTERN), ChronoUnit.WEEKS)); // // System.out.println("========"); // System.out.println(getFirstDayOfYearStr()); // System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println(getLastDayOfYearStr()); // System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println("========"); // System.out.println(getFirstDayOfMonthStr()); // System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println(getLastDayOfMonthStr()); // System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println("========"); // System.out.println(getFirstDayOfWeekStr()); // System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println(getLastDayOfWeekStr()); // System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println("========"); // System.out.println(getStartTimeOfDayStr()); // System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println(getEndTimeOfDayStr()); // System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN))); // System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN)); // // System.out.println("========"); // List<String> dateStrs = listDateStrs("2019-01-30", "2020-12-13", YEAR); // for (String dateStr : dateStrs) // System.out.println(dateStr); // // // System.out.println("========"); // List<String> dateStrs1 = listDateStrs("2019-01-30", "2020-12-13", MONTH); // for (String dateStr : dateStrs1) // System.out.println(dateStr); // // // System.out.println("========"); // List<String> dateStrs2 = listDateStrs("2020-12-01", "2020-12-13", DAY); // for (String dateStr : dateStrs2) // System.out.println(dateStr); // System.out.println(getThreeMonth(new Date())); System.out.println(getNowDay(new Date())); System.out.println(getNowYear(new Date()));
package jm.tsc.tsirm.common.helper;
import java.text.SimpleDateFormat;import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;import java.time.temporal.TemporalAccessor;import java.time.temporal.TemporalAdjusters;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.List;
/** * @PACKAGE_NAME: jm.tsc.tsirm.common.helper * @NAME: DateUtils * @USER: liul * @TIME: 2022/10/27 10:30 * @DAY_NAME_SHORT: 周四 */public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/** * 显示年月日时分秒,例如 2015-08-11 09:51:53. */ public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/** * 仅显示年月日,例如 2015-08-11. */ public static final String DATE_PATTERN = "yyyy-MM-dd";
/** * 仅显示时分秒,例如 09:51:53. */ public static final String TIME_PATTERN = "HH:mm:ss";
/** * 显示年月日时分秒(无符号),例如 20150811095153. */ public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
/** * 仅显示年月日(无符号),例如 20150811. */ public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
/** * 春天; */ public static final Integer SPRING = 1;
/** * 夏天; */ public static final Integer SUMMER = 2;
/** * 秋天; */ public static final Integer AUTUMN = 3;
/** * 冬天; */ public static final Integer WINTER = 4;
/** * 星期日; */ public static final String SUNDAY = "星期日";
/** * 星期一; */ public static final String MONDAY = "星期一";
/** * 星期二; */ public static final String TUESDAY = "星期二";
/** * 星期三; */ public static final String WEDNESDAY = "星期三";
/** * 星期四; */ public static final String THURSDAY = "星期四";
/** * 星期五; */ public static final String FRIDAY = "星期五";
/** * 星期六; */ public static final String SATURDAY = "星期六";
/** * 年 */ private static final String YEAR = "year";
/** * 月 */ private static final String MONTH = "month";
/** * 周 */ private static final String WEEK = "week";
/** * 日 */ private static final String DAY = "day";
/** * 时 */ private static final String HOUR = "hour";
/** * 分 */ private static final String MINUTE = "minute";
/** * 秒 */ private static final String SECOND = "second";
/** * 获取当前日期和时间字符串. * * @return String 日期时间字符串,例如 2015-08-11 09:51:53 */ public static String getLocalDateTimeStr() return format(LocalDateTime.now(), DATETIME_PATTERN);
/** * 获取系统当前时间戳 * * @return 1566889186583 */ public static String getSystemTime() String current = String.valueOf(System.currentTimeMillis()); return current;
/** * 获取当前日期 yy-MM-dd * * @return 2019-08-27 */ public static String getLocalDateStr() Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(date); /** * 获取当前时间字符串. * * @return String 时间字符串,例如 09:51:53 */ public static String getLocalTimeStr() return format(LocalTime.now(), TIME_PATTERN); /** * 获取当前月份 */ public static int getNowMonth(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MONTH) + 1;
/** * 获取当前日 */ public static int getNowDay(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DATE);
/** * 获取当前年份 */ public static int getNowYear(Date date) Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR);
/** * 获取本月份的天数 */ public static int getNowDaysOfMonth() Calendar calendar = Calendar.getInstance(); return daysOfMonth(calendar.get(Calendar.YEAR), calendar.get(Calendar.DATE) + 1);
/** * 获取指定月份的天数 * * @param year 年份 * @param month 月份 * @return 对应天数 */ public static int daysOfMonth(int year, int month) switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if ((year % 4 == 0 && year % 100 == 0) || year % 400 != 0) return 29; else return 28; default: return -1;
/** * 获取当前星期字符串. * * @return String 当前星期字符串,例如 星期二 */ public static String getDayOfWeekStr() return format(LocalDate.now(), "E");
/** * 获取指定日期是星期几 * * @param localDate 日期 * @return String 星期几 */ public static String getDayOfWeekStr(LocalDate localDate) String[] weekOfDays = MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; int dayOfWeek = localDate.getDayOfWeek().getValue() - 1; return weekOfDays[dayOfWeek];
/** * 获取日期时间字符串 * * @param temporal 需要转化的日期时间 可传入LocalDate * @param pattern 时间格式 * @return String 日期时间字符串,例如 2015-08-11 09:51:53 */ public static String format(TemporalAccessor temporal, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return dateTimeFormatter.format(temporal);
/** * 获取指定日期前一天 * * @return 2019-08-26 */ public static String getBeforeDay(Date date)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, -1); date = calendar.getTime(); return sdf.format(date);
/** * 获取指定日期往前最近七天 * * @param date 指定时间 * @return */ public static String getServen(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, -7); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday;
/** * 获取最近一个月 * * @param date 指定时间 * @return */ public static String getOneMonth(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, -1); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday;
/** * 获取最近三个月 * * @param date 指定时间 * @return */ public static String getThreeMonth(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, -3); Date monday = c.getTime(); String preMonday = sdf.format(monday); return preMonday;
/** * 获取最近一年 * * @param date 指定时间 * @return */ public static String getOneYear(Date date) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.YEAR, -1); Date start = c.getTime(); String startDay = sdf.format(start); return startDay;
/** * 日期时间字符串转换为日期时间(java.time.LocalDateTime) * * @param localDateTimeStr 日期时间字符串 * @param pattern 日期时间格式 例如DATETIME_PATTERN * @return LocalDateTime 日期时间 */ public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
/** * 日期字符串转换为日期(java.time.LocalDate) * * @param localDateStr 日期字符串 * @param pattern 日期格式 例如DATE_PATTERN * @return LocalDate 日期 */ public static LocalDate parseLocalDate(String localDateStr, String pattern) DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); return LocalDate.parse(localDateStr, dateTimeFormatter);
/** * 获取指定日期时间加上指定数量日期时间单位之后的日期时间. * * @param localDateTime 日期时间 * @param num 数量 * @param chronoUnit 日期时间单位 * @return LocalDateTime 新的日期时间 */ public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) return localDateTime.plus(num, chronoUnit);
/** * 获取指定日期时间减去指定数量日期时间单位之后的日期时间. * * @param localDateTime 日期时间 * @param num 数量 * @param chronoUnit 日期时间单位 * @return LocalDateTime 新的日期时间 */ public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) return localDateTime.minus(num, chronoUnit);
/** * 根据ChronoUnit计算两个日期时间之间相隔日期时间 * * @param start 开始日期时间 * @param end 结束日期时间 * @param chronoUnit 日期时间单位 * @return long 相隔日期时间 */ public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) return Math.abs(start.until(end, chronoUnit));
/** * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数 * * @param start 开始日期 * @param end 结束日期 * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS) * @return long 相隔年数或月数或天数 */ public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) return Math.abs(start.until(end, chronoUnit));
/** * 获取本年第一天的日期字符串 * * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfYearStr() return getFirstDayOfYearStr(LocalDateTime.now());
/** * 获取本年最后一天的日期字符串 * * @return String 格式:yyyy-MM-dd 23:59:59 */ public static String getLastDayOfYearStr() return getLastDayOfYearStr(LocalDateTime.now());
/** * 获取指定日期当年第一天的日期字符串 * * @param localDateTime 指定日期时间 * @return String 格式:yyyy-MM-dd 00:00:00 */ public static String getFirstDayOfYearStr(LocalDateTime loca
有了这个日期工具类,让日期转化不再烦恼
想必程序员在开发过程中,遇到日期转化肯定避免不了的。它让人爱恨不已,而有些又记不住,每次遇到都得问度娘。我最近在开发过程中亦是如此。
为了让自己更好的记忆,方便以后遇到日期类型转化相关开发。因此,自己作了适当的整理,编写了一个日期工具类,包括获得今天日期、昨天日期、明天日期、日期和字符串之间转化等相关转化。希望这个日期工具类,也能提高你对日期转化的开发效率。
日期工具类:DateTools.java
package com.hrg;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 日期工具类
* @author 格姗知识圈
*/
public class DateTools
/**
* 日期转化为指定日期格式类型
* @param date 日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
*/
public static String dateToString(Date date,String pattern)
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String date_str = sdf.format(date);//日期转化为指定格式
return date_str;
/**
* 日期字符串转化为指定日期格式类型
* @param date_str 日期字符串
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
* @throws ParseException
*/
public static Date stringToDate(String date_str,String pattern) throws ParseException
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
Date date = sdf.parse(date_str);//日期转化为指定格式
return date;
/**
* 获得今天日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
*/
public static String getToday(String pattern)
Date date = new Date();//今天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String today = sdf.format(date);//日期转化为指定格式
return today;
/**
* 获得明天日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
*/
public static String getTomorrow(String pattern)
Date date = new Date();//今天日期
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往后推一天的日期结果,即明天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String tommorrow = sdf.format(date);//明天日期
return tommorrow;
/**
* 获得昨天日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
*/
public static String getYesterday(String pattern)
Date date = new Date();//今天日期
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,-1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往前推一天的日期结果,即昨天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String yesterday = sdf.format(date);//昨天日期
return yesterday;
/**
* 获得指定日期的后一天
* @param date 指定日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
* @throws ParseException
*/
public static Date getAfterDay(Date date,String pattern) throws ParseException
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往后推一天的日期结果,即后一天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String next_date_str = sdf.format(date);//后一天日期
//将日期字符串转化为指定日期格式类型
Date after_date = stringToDate(next_date_str,pattern);
return after_date;
/**
* 获得指定日期的后一天
* @param date_str 指定日期字符串
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
* @throws ParseException
*/
public static String getAfterDay(String date_str,String pattern) throws ParseException
//将日期字符串转化为指定日期格式类型
Date date = stringToDate(date_str,pattern);
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往后推一天的日期结果,即后一天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String after_date_str = sdf.format(date);//后一天日期
return after_date_str;
/**
* 获得指定日期的前一天
* @param date 指定日期
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
* @throws ParseException
*/
public static Date getBeforetDay(Date date,String pattern) throws ParseException
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,-1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往后推一天的日期结果,即前一天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String before_date_str = sdf.format(date);//前一天日期
//将日期字符串转化为指定日期格式类型
Date before_date = stringToDate(before_date_str,pattern);
return before_date;
/**
* 获得指定日期的前一天
* @param date_str 指定日期字符串
* @param pattern 日期格式类型,如yyyy-MM-dd,yyyy年MM月dd日 HH:mm:ss
* @return
* @throws ParseException
*/
public static String getBreforeDay(String date_str,String pattern) throws ParseException
//将日期字符串转化为指定日期格式类型
Date date = stringToDate(date_str,pattern);
Calendar cal = new GregorianCalendar();
cal.setTime(date);//设置时间
cal.add(Calendar.DATE,-1);//把日期往后增加一天.整数往后推,负数往前移动
date = cal.getTime();//这个时间就是日期往后推一天的日期结果,即前一天日期
SimpleDateFormat sdf = new SimpleDateFormat(pattern);//日期格式
String before_date_str = sdf.format(date);//前一天日期
return before_date_str;
测试类:Test.java
package com.hrg;
import java.text.ParseException;
/**
* 测试类
* @author 格姗知识圈
*/
public class Test
public static void main(String[] args) throws ParseException
//日期格式类型
String pattern = "yyyy-MM-dd";
//获得今天日期
System.out.println("---------获得今天日期---------");
String today = DateTools.getToday(pattern);
System.out.println("今天日期:"+today);
//获得明天日期
System.out.println("---------获得明天日期---------");
String tomorrow = DateTools.getTomorrow(pattern);
System.out.println("明天日期:"+tomorrow);
//获得昨天日期
System.out.println("---------获得昨天日期---------");
String yesterday = DateTools.getYesterday(pattern);
System.out.println("昨天日期:"+yesterday);
//获得指定日期的后一天
System.out.println("---------获得指定日期的后一天---------");
String date_str = "2018-10-03";
System.out.println("指定日期:"+date_str);
String after_date = DateTools.getAfterDay(date_str,pattern);
System.out.println("指定日期的后一天:"+after_date);
//获得指定日期的后一天
System.out.println("---------获得指定日期的前一天---------");
System.out.println("指定日期:"+date_str);
String before_date = DateTools.getBreforeDay(date_str,pattern);
System.out.println("指定日期的前一天:"+before_date);
运行结果:
---------获得今天日期---------
今天日期:2018-11-20
---------获得明天日期---------
明天日期:2018-11-21
---------获得昨天日期---------
昨天日期:2018-11-19
---------获得指定日期的后一天---------
指定日期:2018-10-03
指定日期的后一天:2018-10-04
---------获得指定日期的前一天---------
指定日期:2018-10-03
指定日期的前一天:2018-10-02
你看完之后,相信对日期转化有了更好的了解。当然,代码里面有部分是冗余的,主要是为了方便让大家清晰看懂。你看懂理解后,可以根据业务需要进行适当的修改。
以上是关于日期工具类的主要内容,如果未能解决你的问题,请参考以下文章