package com.java110.dto.importData; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.format.ResolverStyle; import java.time.temporal.TemporalAdjusters; import java.util.Calendar; import java.util.Locale; public class Vtil { public static String defaultValue(Object o) { return o == null ? "" : o.toString(); } public static String defaultValueToNumber(Object obj) { // 1. 处理null值 if (obj == null) { return ""; } // 2. 将对象转为字符串(兼容各种类型) String originalStr = String.valueOf(obj); // 3. 使用正则表达式替换所有非数字字符 // \\D 匹配所有非数字字符(等价于 [^0-9]) String numericStr = originalStr.replaceAll("\\D", ""); // 4. 返回处理后的纯数字字符串 return numericStr; } public static Double defaultDouble(Object o) { return o == null || o.equals("") ? null : Double.parseDouble(defaultValue(o)); } public static Double defaultDoubleSplit(Object o) { return o == null || o.equals("") ? null : Double.parseDouble(defaultValue(o).split("/")[0]); } public static String defaultValue(Object o, String defaultValue) { return o == null ? defaultValue : o.toString(); } public static String defaultValueToNull(Object o) { return o == null || o.equals("") ? null : o.toString(); } public static String appendHyphenToRight(String str) { // 1. 判空:null 或 去除首尾空格后为空字符串,都视为"空" if (str == null || str.trim().isEmpty()) { return str; // 空值直接返回,保持原有状态(null还是空字符串) } // 2. 非空则右侧拼接"-" return str + "-"; } public static String defaultValueToDate(Object o) { // 空值直接返回null(原有逻辑) if (o == null || o.toString().isEmpty()) { return null; } try { // 尝试将对象转换为数字(兼容Excel日期序列号,如44747) double excelDateNum = Double.parseDouble(o.toString()); // Excel 1900日期系统基准(修正闰日bug,实际基准是1899-12-30) Calendar calendar = Calendar.getInstance(); calendar.set(1899, 11, 30, 0, 0, 0); // 月份从0开始,11代表12月 calendar.set(Calendar.MILLISECOND, 0); // 计算对应的实际日期 calendar.add(Calendar.DAY_OF_MONTH, (int) excelDateNum); // 格式化为yyyy-MM-dd的日期字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(calendar.getTime()); } catch (NumberFormatException e) { // 非数字类型,执行原有逻辑返回toString() return o.toString(); } } public static String defaultValueToDate(Object o, String state) { // 空值直接返回null(原有逻辑) if (o == null || o.toString().isEmpty() || o.toString().equals("0")) { return null; } String input = o.toString().trim(); // 定义年月格式的解析器 DateTimeFormatter ymFormatter = DateTimeFormatter.ofPattern("yyyy/M") .withLocale(Locale.CHINA) .withResolverStyle(ResolverStyle.LENIENT); // 宽松解析,兼容各种合法格式 try { // 先解析为YearMonth(专门处理年月的类,不会缺少日期维度) YearMonth yearMonth = YearMonth.parse(input, ymFormatter); // 根据state参数处理日期 if ("start".equals(state)) { // state为start时返回当月第一天 LocalDate firstDay = yearMonth.atDay(1); return firstDay.toString(); } else if ("end".equals(state)) { // state为end时返回当月最后一天 LocalDate lastDay = yearMonth.atEndOfMonth(); return lastDay.toString(); } } catch (DateTimeParseException e) { // 不是20xx/01格式,忽略解析异常,执行原有逻辑 } // 非目标格式或state不匹配时,返回原始字符串(原有逻辑) return input; } }