gpt4 book ai didi

Java:无法从 TemporalAccessor 获取 LocalDate

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:06:47 26 4
gpt4 key购买 nike

我正在尝试将 String 日期的格式从 EEEE MMMM d 更改为 MM/d/yyyy,首先,转换将其转换为 LocalDate,然后将不同模式的格式化程序应用于 LocalDate,然后再次将其解析为 String

这是我的代码:

private String convertDate(String stringDate) 
{
//from EEEE MMMM d -> MM/dd/yyyy

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("EEEE MMMM d"))
.toFormatter();

LocalDate parsedDate = LocalDate.parse(stringDate, formatter);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/d/yyyy");

String formattedStringDate = parsedDate.format(formatter2);

return formattedStringDate;
}

但是,我收到了一条我不太理解的异常消息:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'TUESDAY JULY 25' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfWeek=2, MonthOfYear=7, DayOfMonth=25},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)

最佳答案

正如其他答案所说,要创建 LocalDate,您需要 year,它不在输入 String 中。它只有星期几

要获得完整的LocalDate,您需要解析并在中找到日/月组合与星期几匹配。

当然,您可以忽略星期几,并假设日期始终是当前的;在这种情况下,其他答案已经提供了解决方案。但是如果您想找到与星期几完全匹配的,您必须循环直到找到它。

我还创建了一个带有 java.util.Locale 的格式化程序,以明确表示我想要月份星期几 英文名字。如果您不指定区域设置,它将使用系统的默认设置,并且不能保证始终是英语(并且可以在不通知的情况下更改,即使在运行时也是如此)。

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("EEEE MMMM d"))
// use English Locale to correctly parse month and day of week
.toFormatter(Locale.ENGLISH);
// parse input
TemporalAccessor parsed = formatter.parse("TUESDAY JULY 25");
// get month and day
MonthDay md = MonthDay.from(parsed);
// get day of week
DayOfWeek dow = DayOfWeek.from(parsed);
LocalDate date;
// start with some arbitrary year, stop at some arbitrary value
for(int year = 2017; year > 1970; year--) {
// get day and month at the year
date = md.atYear(year);
// check if the day of week is the same
if (date.getDayOfWeek() == dow) {
// found: 'date' is the correct LocalDate
break;
}
}

在此示例中,我从 2017 年开始,并试图找到一个可以追溯到 1970 年的日期,但您可以调整适合您的用例的值。

您还可以使用 Year.now().getValue() 获取当前年份(而不是某个固定的任意值)。

关于Java:无法从 TemporalAccessor 获取 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45320971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com