| | |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.Duration; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.Period; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.time.format.DateTimeParseException; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * Created by wuxw on 2017/7/24. |
| | | */ |
| | | public class DateUtil { |
| | | public static final String DATE_FORMATE_STRING_MILLI = "yyyyMMddHHmmssSSS"; // 17位:年月日时分秒毫秒 |
| | | |
| | | private static DateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss"); |
| | | |
| | | public static final String LAST_TIME = "2050-01-01 00:00:00"; |
| | | |
| | | public static int getTotalDaysInMonth(int year, int month) { |
| | | LocalDate date = LocalDate.of(year, month, 1); // 创建一个日期对象,年份和月份为指定值,日期为1号 |
| | | return date.lengthOfMonth(); // 返回该月的天数 |
| | | } |
| | | private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | |
| | | public static boolean isValidDate(String dateStr) { |
| | | // ✅ 关键修复:先彻底去除前后空白(包括空格、制表符、换行) |
| | | if (dateStr == null || dateStr.isEmpty()) { |
| | | return true; |
| | | } |
| | | |
| | | // 去掉所有空白后再校验 |
| | | String cleanDate = dateStr.trim(); |
| | | |
| | | try { |
| | | LocalDate.parse(cleanDate, DATE_FORMATTER); |
| | | return true; |
| | | } catch (DateTimeParseException e) { |
| | | return false; |
| | | } |
| | | } |
| | | private static Map<String, SimpleDateFormat> formats = new HashMap(); |
| | | public static final String DATE_FORMATE_STRING_DEFAULT = "yyyyMMddHHmmss"; |
| | | public static final String DATE_FORMATE_STRING_A = "yyyy-MM-dd HH:mm:ss"; |
| | | public static final String DATE_FORMATE_STRING_B = "yyyy-MM-dd"; |
| | | public static final String DATE_FORMATE_STRING_SLASH_NON_ZERO = "yyyy/M/d"; |
| | | public static final String DATE_FORMATE_STRING_C = "MM/dd/yyyy HH:mm:ss a"; |
| | | public static final String DATE_FORMATE_STRING_D = "yyyy-MM-dd HH:mm:ss a"; |
| | | public static final String DATE_FORMATE_STRING_E = "yyyy-MM-dd'T'HH:mm:ss'Z'"; |
| | |
| | | public static final String DATE_FORMATE_STRING_N = "HHmmss"; |
| | | public static final String DATE_FORMATE_STRING_O = "yyyyMMddHHmm"; |
| | | public static final String DATE_FORMATE_STRING_Q = "yyyy-MM"; |
| | | private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | |
| | | static { |
| | | formats.put("yyyyMMddHHmmss", new SimpleDateFormat("yyyyMMddHHmmss")); |
| | | formats.put("yyyy-MM-dd HH:mm:ss", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); |
| | | formats.put("yyyy-MM-dd", new SimpleDateFormat("yyyy-MM-dd")); |
| | | formats.put("yyyy/MM/dd", new SimpleDateFormat("yyyy/M/d")); |
| | | formats.put("MM/dd/yyyy HH:mm:ss a", new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a")); |
| | | formats.put("yyyy-MM-dd HH:mm:ss a", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a")); |
| | | formats.put("yyyy-MM-dd'T'HH:mm:ss'Z'", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")); |
| | |
| | | return a.getActualMaximum(Calendar.DAY_OF_MONTH); |
| | | } |
| | | |
| | | public static void main(String[] args) throws ParseException { |
| | | |
| | | // SimpleDateFormat sf = new SimpleDateFormat(DateUtil.DATE_FORMATE_STRING_A); |
| | | // Calendar c = Calendar.getInstance(); |
| | | // c.setTime(DateUtil.getDateFromString("2021-12-03",DateUtil.DATE_FORMATE_STRING_A)); |
| | | // c.add(Calendar.DAY_OF_MONTH, 125); |
| | | // System.out.println("增加一天后日期:"+sf.format(c.getTime())); |
| | | System.out.println("2021-12-07".compareTo(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B))); |
| | | } |
| | | |
| | | public static String getAddDayString(Date date, String pattern, int days) { |
| | | SimpleDateFormat sf = new SimpleDateFormat(pattern); |
| | |
| | | |
| | | return result.toString(); |
| | | } |
| | | |
| | | /** |
| | | * 计算两个字符串日期之间的月数(超过一个整月则+1) |
| | | * @param startDateStr 开始日期字符串 |
| | | * @param endDateStr 结束日期字符串 |
| | | * @return 月数差 |
| | | */ |
| | | public static int calculateMonths(String startDateStr, String endDateStr) { |
| | | startDateStr = dateTimeToDate(startDateStr); |
| | | endDateStr = dateTimeToDate(endDateStr); |
| | | // 解析时间字符串为LocalDateTime |
| | | LocalDateTime start = LocalDateTime.parse(startDateStr + " 00:00:00", DEFAULT_FORMATTER); |
| | | LocalDateTime end = LocalDateTime.parse(endDateStr + " 23:59:59", DEFAULT_FORMATTER); |
| | | |
| | | // 确保开始时间在结束时间之前 |
| | | if (start.isAfter(end)) { |
| | | LocalDateTime temp = start; |
| | | start = end; |
| | | end = temp; |
| | | } |
| | | |
| | | // 提取日期部分计算完整月数 |
| | | Period period = Period.between(start.toLocalDate(), end.toLocalDate()); |
| | | int fullMonths = period.getYears() * 12 + period.getMonths(); |
| | | |
| | | // 计算完整月数后的目标时间(用于判断是否刚好整月) |
| | | LocalDateTime targetTime = start.plusYears(period.getYears()).plusMonths(period.getMonths()); |
| | | |
| | | // 判断实际结束时间是否超过目标时间(即存在额外时间) |
| | | boolean hasExtraTime = end.isAfter(targetTime); |
| | | |
| | | // 有额外时间则加1个月 |
| | | if (hasExtraTime) { |
| | | fullMonths++; |
| | | } |
| | | return fullMonths; |
| | | } |
| | | |
| | | public static void main(String[] args) throws ParseException { |
| | | |
| | | // SimpleDateFormat sf = new SimpleDateFormat(DateUtil.DATE_FORMATE_STRING_A); |
| | | // Calendar c = Calendar.getInstance(); |
| | | // c.setTime(DateUtil.getDateFromString("2021-12-03",DateUtil.DATE_FORMATE_STRING_A)); |
| | | // c.add(Calendar.DAY_OF_MONTH, 125); |
| | | // System.out.println("增加一天后日期:"+sf.format(c.getTime())); |
| | | System.out.println(calculateMonths("2025-02-01 00:00:00", "2025-02-28")); |
| | | } |
| | | |
| | | } |