java 怎么把一个String字符串例如2022-01-01,转换为localdate经过DateTimeFormatter格式化后再转换为String格式
时间: 2023-06-01 16:06:28 浏览: 116
您好!感谢您的提问。让我来回答您的问题。
首先,可以使用LocalDate的parse方法将String转换为LocalDate对象,然后使用DateTimeFormatter的ofPattern方法创建需要的格式。最后使用format方法将LocalDate对象格式化为String。
下面是具体的代码:
```
String dateStr = "2022-01-01";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.ENGLISH);
LocalDate localDate = LocalDate.parse(dateStr);
String formattedDate = formatter.format(localDate);
System.out.println(formattedDate);
```
我希望这个回答对您有所帮助。如果您有其他问题,请随时问我。
相关问题
String csrq = "2025-02-22"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate birthDate = LocalDate.parse(csrq, formatter); LocalDate currentDate = LocalDate.now(); Period period = Period.between(birthDate, currentDate); System.out.println(period.getYears()); 如果年份为零计算月 月份为零计算天
<think>好的,我现在需要解决用户的问题:在Java中使用Period和DateTimeFormatter来计算年龄,精确到年、月、日,并且当年份或月份为零时,能够按月或日进一步计算。用户提供的示例代码是JavaScript的,但需要转换到Java,特别是利用Java 8的日期时间API。
首先,我得回顾一下Java中的Period类。Period用于表示两个日期之间的时间量,比如多少年、月、日。使用Period.between(startDate, endDate)可以得到两者之间的差异。但Period会分别计算年、月、日的差值,例如,如果开始日期是2020-02-15,结束日期是2023-03-20,那么Period会给出3年1个月5天。但是如果计算两个日期比如2023-01-01到2023-03-01,Period的结果是0年2个月0天。用户的需求是,当年份为零时,只显示月份和天数;如果月份也为零,只显示天数。但这里可能需要更详细的处理,比如当年份为零,但月份不为零时,可能需要将月份转换为天数,或者类似的操作?
不过用户的问题可能更倾向于格式化显示,而不是转换单位。例如,如果Period的结果是0年3个月5天,那么显示“3个月5天”;如果是0年0个月10天,则显示“10天”。而当年份不为零时,就显示完整的年、月、日。
接下来,我需要考虑如何根据Period的结果动态构建字符串。可能需要检查Period中的年、月、日是否为零,并逐步构建相应的部分。例如:
- 如果年>0,则添加“X年”。
- 如果月>0,则添加“X个月”。
- 如果日>0,则添加“X天”。
- 如果所有都是零,可能需要处理特殊情况,比如天数差为0,显示“0天”或者“当天”。
另外,用户提到使用DateTimeFormatter,这可能是指如何解析输入的日期字符串。例如,用户输入的出生日期可能是字符串,需要用DateTimeFormatter来解析为LocalDate对象。
可能的步骤:
1. 解析输入的出生日期和当前日期为LocalDate对象。
2. 使用Period.between(birthDate, currentDate)计算期间。
3. 根据Period的年、月、日值构建结果字符串,忽略零值部分,但当高位为零时显示低位的部分。例如,如果年为0,但月不为零,则显示月和日;如果年和月都为零,则显示日。
需要注意的是,Period的计算是基于日期的自然差异,例如,两个日期之间的月份差可能不会转换为天数。比如,2023-01-31到2023-02-28之间的月份差是1个月,但实际天数差是28天,但Period会显示0个月,负的天数吗?或者需要调整?
不过根据Java的Period.between的文档,该方法返回的Period是基于年、月、日的差异,比如,两个日期之间的差可能为1个月3天,不管这两个日期之间具体的总天数。例如,2023-01-30到2023-03-02的Period会是1个月2天,因为从1月30日到2月28日是1个月,然后加2天到3月2日。
因此,在计算年龄时,可能需要这种基于日历的差异,而不是绝对天数。因此,用户的需求应该是正确的。
现在,如何处理当年份为零时按月计算,月份为零时按天计算。例如,如果Period返回0年2个月15天,则显示“2个月15天”;如果是0年0个月10天,则显示“10天”。
编写一个方法,根据Period的getYears(), getMonths(), getDays()来构建字符串:
- 如果有年,则添加年部分。
- 不管年是否存在,如果月存在,则添加月部分。
- 不管年月是否存在,添加天部分,但可能用户希望如果年或月存在,则天部分也显示。例如,0年1个月0天,显示“1个月”,而0年0个月5天则显示“5天”。
或者,用户可能希望当年份为零时,将月份显示出来,如果月份也为零,则显示天数。例如,如果Period返回0年0个月5天,则显示“5天”;如果返回0年3个月0天,则显示“3个月”;如果返回0年3个月5天,则显示“3个月5天”;如果有1年0个月5天,则显示“1年5天”吗?或者是否要显示所有非零部分,不管高位是否有零?
比如,用户的问题描述中说“当计算出的年份为零时需要进一步按月计算,若月份也为零则按天数进行计算。”这可能意味着,如果年份为零,那么显示月份和天数;但如果月份也为零,则只显示天数。例如:
情况1:年=0,月=2,天=5 → 显示“2个月5天”
情况2:年=0,月=0,天=10 → 显示“10天”
情况3:年=1,月=0,天=5 → 显示“1年5天”?
或者,是否在年不为零的情况下,忽略月份是否为零?比如,年=1,月=0,天=5,是否显示“1年5天”?或者是否显示所有非零部分,但例如,年存在的话,不管月是否为零,都显示?
这可能需要进一步明确用户的需求。根据用户的问题描述,当年份为零时才按月处理,否则可能直接显示年、月、日。例如:
如果年份不为零,不管月份是否为零,都显示年,然后是月,然后是日。例如,年=1,月=0,日=5 → 显示“1年0个月5天”?或者用户可能希望在这种情况下,不显示月份为零的部分?
这可能要根据用户的示例代码逻辑。用户给出的示例代码是JavaScript,当计算month、day、year,然后组合成字符串。例如,原JavaScript代码中的月份是getMonth()+1,然后显示month/day/year。但用户的新需求是当year为零时,按月计算,如果月为零则按天数。
在Java中,假设用户希望将年龄分解为年、月、日,但如果年为零,则忽略年部分,显示月和日;如果月和年都为零,则显示日。
例如:
- 如果年龄是2年3个月,那么显示“2年3个月”。
- 如果年龄是0年6个月15天,显示“6个月15天”。
- 如果年龄是0年0个月5天,显示“5天”。
所以,构建字符串的逻辑应该是:
StringBuilder result = new StringBuilder();
if (years > 0) {
result.append(years).append("年");
}
if (months > 0) {
result.append(months).append("个月");
}
if (days > 0 || (years == 0 && months == 0)) {
result.append(days).append("天");
}
但是这可能有问题,比如当years=0,months=3,days=0时,会显示“3个月0天”,但用户可能希望此时显示“3个月”。
或者,需要进一步调整逻辑:
构建各个部分的条件:
- 年部分:如果years >0,添加年。
- 月部分:如果months>0,添加月。
- 天部分:如果days>0,或者年、月都为0,则添加天(即使天为0)。
例如,当年龄是0年0月0天时,显示“0天”。
或者,可能用户希望如果所有都是零,比如在同一天出生,则显示“0天”。
所以,正确的逻辑应该是:
构建各个部分,只要对应的数值大于0,或者当所有高位都是零时,显示低位。例如:
如果years>0,显示年,否则检查months>0,显示月,否则显示天。
但是这样可能无法处理混合情况,例如,years=0,months=2,days=5,应该显示“2个月5天”。
所以正确的逻辑应该是:
StringBuilder result = new StringBuilder();
boolean hasYears = years > 0;
boolean hasMonths = months > 0;
boolean hasDays = days > 0;
if (hasYears) {
result.append(years).append("年");
}
if (hasMonths) {
result.append(months).append("个月");
}
if (hasDays || (!hasYears && !hasMonths)) {
result.append(days).append("天");
}
这样,当有年或月时,天会被添加,但如果没有年、月,但天为0,也会显示“0天”。
例如:
情况1:years=0, months=0, days=5 → 显示“5天”
情况2:years=0, months=3, days=0 → 显示“3个月0天” → 这可能不符合用户预期,因为用户可能希望在这种情况下显示“3个月”,而不显示0天。
这说明原来的逻辑有问题,因为当months>0但days=0时,会附加days=0。
所以,需要调整条件,使得只有当有天数或者所有更高位都是零时,才显示天数,但天数必须大于零,除非所有更高位都是零。
比如:
只有在以下情况下显示天数:
- 如果有天 >0,或者
- 年、月均为零(即使天数为零)
所以,正确的条件应该是:
显示天数的条件:days >0 || (years == 0 && months == 0)
因此,修改代码为:
if (hasYears) {
result.append(years).append("年");
}
if (hasMonths) {
result.append(months).append("个月");
}
if (days > 0 || (years == 0 && months == 0)) {
result.append(days).append("天");
}
这样:
情况:years=0, months=0, days=0 → 显示“0天”
情况:years=0, months=0, days=5 → “5天”
情况:years=0, months=3, days=0 → 显示“3个月0天” → 但用户可能希望在这种情况下不显示天数,因为月份已经存在,即使天数是零?
这可能需要用户澄清,但根据用户的问题描述,当年份为零时,需要按月计算,如果月份也为零则按天数。可能用户希望如果年份为零,则显示月份和天数,不管是否为零?或者只有当月份存在时才显示?
或者用户希望当年份为零时,显示月份和天数,但如果月份也为零,则显示天数(无论是否为零?)
比如,原JavaScript代码中的例子可能将天数显示出来,比如month + '/' + day + '/' + year,不管各部分的数值是否为0。但在年龄计算时,用户可能不希望显示0个月或0天,除非必要。
这可能比较复杂。需要再仔细分析用户的问题。
用户的问题描述是:“当计算出的年份为零时需要进一步按月计算,若月份也为零则按天数进行计算。” 这里的“进一步计算”可能是指将年转换为月,或者月转换为天?或者只是显示对应的单位?
可能用户的意思是,当年份为零时,显示剩余的月份和天数,即使月份可能不为零;如果月份也为零,则只显示天数。例如,年龄是0年3个月5天 → 显示3个月5天;年龄是0年0个月10天 → 显示10天。而如果年龄是1年0个月5天 → 显示1年5天?或者是否显示0个月?
这可能取决于用户的需求,但通常年龄的表示中,如果高位有数值,低位的是否为零可能被忽略。例如,1年0个月5天可能显示为“1年5天”,而0年3个月0天显示为“3个月”。
但根据用户的问题描述,当年份为零时,进一步按月计算,可能意味着显示月份,不管是否为0?或者只显示月份和天数如果月份不为零?
这可能需要更明确的逻辑。例如:
- 如果年>0,显示年,然后不管月是否为零,显示月,然后不管日是否为零,显示日?
- 如果年=0,月>0,显示月,然后显示日(无论是否为0)?
- 如果年=0,月=0,显示日(无论是否为0)?
比如,当计算结果是0年0个月0天时(比如当天生日),可能需要显示“0天”。
这可能比较复杂,但根据用户的需求,假设他们希望:
- 当年份不为零时,显示年、月、日,不管是否为零?
- 当年份为零时,显示月和日,不管是否为零?
- 当月份也为零时,显示日,不管是否为零?
这可能不符合常规的年龄显示方式,因为例如,0年0个月0天可能应该显示为“0天”,但如果是0年5个月0天,可能应显示为“5个月0天”?但用户可能希望在这种情况下只显示“5个月”。
这可能意味着需要调整逻辑,只显示非零的部分,但当高位为零时显示低位的非零部分。
例如:
年龄分解为年、月、日,依次检查,如果年>0,则显示年,并显示月、日,不管是否为0;否则,如果月>0,则显示月,并显示日;否则显示日。
这可能不符合常规做法,但需要按用户的具体要求处理。
另一种思路是,将年龄分解为最大的单位,例如,如果有年,则用年,否则用月,否则用天。例如:
如果年>0 → X年
否则,如果月>0 → X个月
否则 → X天
但这样会丢失更小的单位。例如,0年3个月5天会被显示为3个月,而忽略5天。这可能不是用户想要的。
因此,用户可能需要完整的年、月、日显示,但隐藏高位为零的单位。例如:
- 如果年>0 → 显示年,之后显示月(不管是否为0),然后显示日(不管是否为0)
- 如果年=0且月>0 → 显示月,然后显示日(不管是否为0)
- 如果年=0,月=0 → 显示日
比如,Period的结果是1年2个月3天 → 显示“1年2个月3天”
Period是0年2个月3天 → 显示“2个月3天”
Period是0年0个月3天 → 显示“3天”
Period是0年2个月0天 → 显示“2个月0天” ?这可能不符合用户预期,因为0天可能应该被省略。但用户的问题描述中没有明确说明这一点。
或者,用户可能希望当高位为零时,显示所有低位部分,即使为零?
这可能需要进一步的假设。
根据用户提供的示例,他们可能希望当年份为零时,显示月和天,而不管月份是否为零。例如,当月份为零时,显示天数。类似地,如果月份也为零,则显示天数,即使天数可能为零(例如,当天的情况)。
这可能意味着:
构建字符串时:
- 如果有年,显示年,然后显示月,然后显示天。
- 如果无年但有月,显示月,然后显示天。
- 如果无年无月,显示天。
不管各个部分是否为零。例如:
1年0个月5天 → 显示“1年0个月5天” → 这可能不友好,但用户可能需要这样?
或者,可能用户希望只显示非零的部分。例如:
当计算出的年、月、日中,某部分为零时,则省略该部分。例如:
1年0个月5天 → 显示“1年5天”
0年2个月0天 → 显示“2个月”
0年0个月5天 → 显示“5天”
这种情况下,构建字符串的逻辑是:只显示非零的部分,但需要考虑顺序。例如,年存在时,显示年,并显示非零的月、日;如果月存在(但年不存在),显示月,并显示非零的日;否则显示日。
这可能更合理。例如:
代码逻辑:
StringBuilder result = new StringBuilder();
if (years > 0) {
result.append(years).append("年");
if (months > 0) {
result.append(months).append("个月");
}
if (days > 0) {
result.append(days).append("天");
}
} else if (months > 0) {
result.append(months).append("个月");
if (days > 0) {
result.append(days).append("天");
}
} else {
result.append(days).append("天");
}
这样处理的话:
情况1:years=1, months=0, days=5 → 显示“1年5天”
情况2:years=0, months=2, days=0 → 显示“2个月”
情况3:years=0, months=0, days=5 → 显示“5天”
情况4:years=0, months=3, days=5 → 显示“3个月5天”
情况5:years=0, months=0, days=0 → 显示“0天”
这可能更符合用户的需求。但用户的问题描述中提到“当计算出的年份为零时需要进一步按月计算,若月份也为零则按天数进行计算”,这可能对应于上述的else if结构。
现在,如何在Java中实现这个逻辑?
假设我们已经得到了Period对象,其中包含years、months、days的值。
然后,编写一个方法:
public static String formatAge(int years, int months, int days) {
StringBuilder sb = new StringBuilder();
if (years > 0) {
sb.append(years).append("年");
if (months > 0) {
sb.append(months).append("个月");
}
if (days > 0) {
sb.append(days).append("天");
}
} else if (months > 0) {
sb.append(months).append("个月");
if (days > 0) {
sb.append(days).append("天");
}
} else {
sb.append(days).append("天");
}
return sb.toString();
}
但是这可能有问题,例如,当years>0,但months和days都是0时,会显示“X年”;当months>0但days=0时,显示“X个月”。
这样,是否符合用户的需求?
例如,用户希望当years=0时,显示months和days,但当months=0时,显示days。比如:
当Period的years=0, months=2, days=5 → “2个月5天”
当years=0, months=0, days=5 → “5天”
当years=1, months=0, days=5 → “1年5天”
当years=1, months=2, days=0 → “1年2个月”
当years=1, months=0, days=0 → “1年”
这可能合理,但用户可能需要显示所有的非零部分,不管顺序如何?
或者是否应该显示所有非零部分,不管是否在年之后?
例如,当years=1, months=0, days=5 → 应该显示“1年5天”,因为即使months=0,但days>0,所以显示年、天?
是的,因为在这种情况下,用户可能希望显示年、天,而忽略月份为零的部分。
所以,上述代码是否正确?
比如:
在years>0的情况下,无论months是否为0,如果days>0,则附加天?
根据上面的代码逻辑,当years>0时,会先添加年,然后如果months>0,则添加月,然后如果days>0则添加天。例如:
years=1, months=0, days=5 → 显示“1年5天”
而如果years=1, months=2, days=0 → 显示“1年2个月”
如果years=1, months=2, days=5 → 显示“1年2个月5天”
这可能正确。
现在,如何将Period对象的值传递给这个方法?
假设我们有两个LocalDate对象:birthDate和currentDate。
计算Period:
Period period = Period.between(birthDate, currentDate);
然后,获取年、月、日:
int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();
但需要注意的是,Period.between的结果可能为负,如果birthDate在currentDate之后。所以,需要确保birthDate在currentDate之前,否则可能需要取绝对值或者处理异常。
但用户的问题可能假设输入是合法的,即出生日期在当前日期之前。
现在,测试一些案例:
案例1:birthDate = 2020-01-01,currentDate = 2023-01-01 → Period是3年0个月0天 → 显示“3年”
案例2:birthDate = 2023-03-01,currentDate = 2023-05-15 → Period是0年2个月14天 → 显示“2个月14天”
案例3:birthDate = 2023-05-01,currentDate = 2023-05-10 → Period是0年0个月9天 → 显示“9天”
案例4:birthDate = 2023-01-15,currentDate = 2024-01-15 → Period是1年0个月0天 → 显示“1年”
案例5:birthDate = 2023-02-28,currentDate = 2023-03-28 → Period是0年1个月0天 → 显示“1个月”
案例6:birthDate = 2023-02-28,currentDate = 2023-03-01 → 这里Period.between会得到0年0个月1天?因为从2月28日到3月1日是一天后的闰日?
需要验证这个结果。例如:
LocalDate date1 = LocalDate.of(2023, 2, 28);
LocalDate date2 = LocalDate.of(2023, 3, 1);
Period p = Period.between(date1, date2);
System.out.println(p.getYears() + " " + p.getMonths() + " " + p.getDays());
输出为0 0 3?或者 0 0 1?
实际运行这段代码会输出0年0个月3天?或者可能因为Period的计算方式是基于月份和年份的变化?
不,实际上,Period.between会计算年份差、月份差和天数差。例如,从2023-02-28到2023-03-01,年份差0,月份差1(3月 - 2月 = 1),天数差-27天?或者计算方法不同?
或者,Period.between的计算方式是这样的:它计算两个日期之间的年数、月数和天数,使得当将开始日期加上该Period后,会得到结束日期。例如:
date1.plus(Period.of(0, 1, 3))等于date2吗?或者可能需要具体测试。
例如:
LocalDate start = LocalDate.of(2023, 2, 28);
LocalDate end = LocalDate.of(2023, 3, 1);
Period period = Period.between(start, end);
start.plus(period)应该等于end吗?
计算period的值:
getYears() = 0
getMonths() = 0
getDays() = 1?
因为从2月28日到3月1日相差一天。所以,Period.between(start, end)返回0年0个月1天。
此时,年龄显示为“1天”。
那如果birthDate是2023-02-28,currentDate是2023-03-28,Period是0年1个月0天 → 显示“1个月”。
所以,之前的逻辑是正确的。
现在,回到代码。假设用户输入的日期被正确解析为LocalDate,例如使用DateTimeFormatter:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate birthDate = LocalDate.parse("2000-05-15", formatter);
LocalDate currentDate = LocalDate.now();
Period period = Period.between(birthDate, currentDate);
然后,调用formatAge方法得到结果字符串。
接下来,如何处理当用户输入的日期字符串可能有不同的格式?例如,用户可能使用不同的分隔符或者顺序。但根据用户的问题,可能假设输入格式正确,并且使用DateTimeFormatter来解析。
综上,Java代码的大致结构是:
public class AgeCalculator {
public static void main(String[] args) {
String birthDateString = "2000-05-15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate birthDate = LocalDate.parse(birthDateString, formatter);
LocalDate currentDate = LocalDate.now();
Period period = Period.between(birthDate, currentDate);
String age = formatAge(period.getYears(), period.getMonths(), period.getDays());
System.out.println("年龄:" + age);
}
public static String formatAge(int years, int months, int days) {
StringBuilder sb = new StringBuilder();
if (years > 0) {
sb.append(years).append("年");
if (months > 0) {
sb.append(months).append("个月");
}
if (days > 0) {
sb.append(days).append("天");
}
} else if (months > 0) {
sb.append(months).append("个月");
if (days > 0) {
sb.append(days).append("天");
}
} else {
sb.append(days).append("天");
}
return sb.toString();
}
}
这应该能处理用户的需求。例如,当年份为零时,显示月和天;当月份也为零时,显示天。
现在,测试一些例子:
例子1:birthDate是2023-01-01,currentDate是2023-01-01 → period是0年0个月0天 → 显示“0天”
例子2:birthDate是2023-01-01,currentDate是2023-02-01 → period是0年1个月0天 → 显示“1个月”
例子3:birthDate是2023-01-01,currentDate是2023-02-05 → period是0年1个月4天 → 显示“1个月4天”
例子4:birthDate是2000-05-15,currentDate是2023-05-20 → period是23年0个月5天 → 显示“23年5天”
这样处理是否符合用户的需求?
用户的问题中提到的“当计算出的年份为零时需要进一步按月计算,若月份也为零则按天数进行计算”,这正是上述代码所处理的逻辑。
关于DateTimeFormatter的使用,用户可能需要根据输入的日期字符串格式来调整模式。例如,如果输入是“dd/MM/yyyy”,则需要相应的formatter。
最后,用户提到的“当计算出的年份为零时需要进一步按月计算,若月份也为零则按天数进行计算”在代码中通过判断years、months是否为0来切换显示单位,符合要求。</think>在Java中,使用`Period`和`DateTimeFormatter`计算年龄并格式化输出,可以通过以下步骤实现:
### 实现步骤
1. **解析日期**:将输入的出生日期字符串转换为`LocalDate`对象。
2. **计算时间差**:使用`Period.between()`计算两个日期的年、月、日差值。
3. **动态构建结果**:根据差值动态生成年龄字符串,若高位单位为零则忽略。
```java
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class AgeCalculator {
public static String calculateAge(String birthDateStr, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
LocalDate currentDate = LocalDate.now();
Period period = Period.between(birthDate, currentDate);
return formatAge(period.getYears(), period.getMonths(), period.getDays());
}
private static String formatAge(int years, int months, int days) {
StringBuilder sb = new StringBuilder();
if (years > 0) {
sb.append(years).append("年");
if (months > 0) sb.append(months).append("个月");
if (days > 0) sb.append(days).append("天");
} else if (months > 0) {
sb.append(months).append("个月");
if (days > 0) sb.append(days).append("天");
} else {
sb.append(days).append("天");
}
return sb.toString();
}
public static void main(String[] args) {
String age = calculateAge("2000-05-15", "yyyy-MM-dd");
System.out.println("年龄:" + age); // 示例输出:年龄:23年0个月5天
}
}
```
### 关键逻辑说明
1. **日期解析**:通过`DateTimeFormatter`将字符串转为`LocalDate`,支持自定义格式(如`yyyy-MM-dd`)。
2. **差值计算**:`Period.between()`返回年、月、日的时间差,例如:
$$ \text{Period}(2000-05-15, 2023-05-20) \rightarrow 23\text{年}, 0\text{个月}, 5\text{天} $$
3. **结果格式化**:根据差值动态拼接字符串:
- 若年>0,显示年,并追加非零的月、日;
- 若年=0且月>0,显示月,并追加非零的日;
- 若年=0且月=0,仅显示日。
### 示例输出
- 输入日期`2000-05-15`,当前日期`2023-05-20` → 输出:`23年5天`
- 输入日期`2023-03-01`,当前日期`2023-05-15` → 输出:`2个月14天`
- 输入日期`2023-05-10`,当前日期`2023-05-10` → 输出:`0天`
### 注意事项
- 日期格式需与输入字符串匹配,否则抛出`DateTimeParseException`。
- 若出生日期晚于当前日期,`Period`可能为负值,需额外处理[^1]。
阅读全文