|
|
@@ -0,0 +1,90 @@
|
|
|
+package cn.tr.core.utils;
|
|
|
+
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.Period;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.format.DateTimeParseException;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 年龄计算工具类(支持 LocalDate、Date、字符串日期)
|
|
|
+ * 规则:按周岁计算(生日未过则年龄减 1)
|
|
|
+ */
|
|
|
+public class AgeUtils {
|
|
|
+
|
|
|
+ // ==================== 方法 1:接收 LocalDate(Java 8+ 推荐) ====================
|
|
|
+ /**
|
|
|
+ * 根据 LocalDate 出生日期计算年龄(周岁)
|
|
|
+ * @param birthDate 出生日期(如:LocalDate.of(2000, 6, 10))
|
|
|
+ * @return 年龄(出生日期为未来时返回 0)
|
|
|
+ */
|
|
|
+ public static int calculateAge(LocalDate birthDate) {
|
|
|
+ if (birthDate == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ LocalDate now = LocalDate.now(); // 系统默认时区(若需指定上海时区,可传 ZoneId:LocalDate.now(ZoneId.of("Asia/Shanghai")))
|
|
|
+ if (birthDate.isAfter(now)) { // 出生日期在未来,返回 0
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ Period period = Period.between(birthDate, now);
|
|
|
+ return period.getYears();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ==================== 方法 2:接收 java.util.Date(兼容旧代码) ====================
|
|
|
+ /**
|
|
|
+ * 根据 Date 出生日期计算年龄(周岁)
|
|
|
+ * @param birthDate 出生日期
|
|
|
+ * @return 年龄(出生日期为未来时返回 0)
|
|
|
+ */
|
|
|
+ public static Integer calculateAge(Date birthDate) {
|
|
|
+ if (birthDate == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Calendar birthCal = Calendar.getInstance();
|
|
|
+ birthCal.setTime(birthDate);
|
|
|
+ Calendar nowCal = Calendar.getInstance();
|
|
|
+
|
|
|
+ int yearDiff = nowCal.get(Calendar.YEAR) - birthCal.get(Calendar.YEAR);
|
|
|
+ int monthDiff = nowCal.get(Calendar.MONTH) - birthCal.get(Calendar.MONTH);
|
|
|
+ int dayDiff = nowCal.get(Calendar.DAY_OF_MONTH) - birthCal.get(Calendar.DAY_OF_MONTH);
|
|
|
+
|
|
|
+ // 调整:若当前月份 < 出生月份,或同月但日期更小,年龄减 1
|
|
|
+ if (monthDiff < 0 || (monthDiff == 0 && dayDiff < 0)) {
|
|
|
+ yearDiff--;
|
|
|
+ }
|
|
|
+ // 确保年龄非负(应对未来日期)
|
|
|
+ return Math.max(yearDiff, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ==================== 方法 3:接收字符串日期(需指定格式,如 "yyyy-MM-dd") ====================
|
|
|
+ /**
|
|
|
+ * 根据字符串日期和格式计算年龄(周岁)
|
|
|
+ * @param birthDateStr 日期字符串(如 "2000-06-10")
|
|
|
+ * @param format 日期格式(如 "yyyy-MM-dd")
|
|
|
+ * @return 年龄(解析失败或未来日期返回 0)
|
|
|
+ */
|
|
|
+ public static int calculateAge(String birthDateStr, String format) {
|
|
|
+ if (birthDateStr == null || format == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
|
|
|
+ LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
|
|
|
+ return calculateAge(birthDate);
|
|
|
+ } catch (DateTimeParseException e) {
|
|
|
+ // 日志记录解析异常(建议实际项目中添加日志)
|
|
|
+ e.printStackTrace();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 简化版:默认日期格式为 "yyyy-MM-dd"
|
|
|
+ */
|
|
|
+ public static int calculateAge(String birthDateStr) {
|
|
|
+ return calculateAge(birthDateStr, "yyyy-MM-dd");
|
|
|
+ }
|
|
|
+}
|