当前位置: 首页 > 知识库问答 >
问题:

无法使用DateTimeFormatter解析月+日

魏凡
2023-03-14
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.text.SimpleDateFormat;  
import java.util.Date;  
import java.util.Locale;

// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] args) throws Exception
  {

    String str = "Mon 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    LocalDate datetext = LocalDate.parse(str, parseFormatter);

  }
}
  public static void main(String[] args) throws Exception
  {

    String str = "Tue 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    LocalDate datetext = LocalDate.parse(str, parseFormatter);

  }
}

错误:

线程“main”java.time.format.dateTimeParseException:无法解析文本“Tue 21 May”:无法从TemporalAccessor获取LocalDate:{DayOfWeek=2,DayOfMonth=21,MonthOfYear=5},类型为java.time.format.dateTimeFormatter.createError(dateTimeFormatter.java:1920)在java.time.format.dateTimeFormatter.jave:1855)在java.time.LocalDate.parse(dateTimeFormatter.java:1855)在java.time.LocalDate.parse(LocalDate.java:400)在EtimeException:无法从TemporalAccessor获取LocalDate:{DayOfWeek=2,DayOfMonth=21,MonthOfYear=5},类型为java.time.LocalDate.from(LocalDate.java:368)的ISO at java.time.LocalDate.from(LocalDate.java:368)at java.time.format.parse.query(parsed.java:226)at java.time.format.dateTimeFormatter.parse(dateTimeFormatter.jave:1851)...

共有1个答案

温凯
2023-03-14

如果要在没有年份的情况下解析月份和日期,请使用monthday:

    String str = "Mon 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    MonthDay md = MonthDay.parse(str, parseFormatter);
    System.out.println(md);

输出为:

--05-21

    LocalDate datetext = md.atYear(Year.now(ZoneId.of("Europe/London")).getValue());
    System.out.println(datetext);
    String str = "Tue 21st May";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .appendPattern("EEE d['st']['nd']['rd']['th'] MMMM")
            .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.of("Europe/London")).getValue())
            .toFormatter(Locale.ENGLISH);

    LocalDate datetext = LocalDate.parse(str, parseFormatter);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("EEEE d MMMM", Locale.ENGLISH);
    System.out.println(datetext.format(outputFormatter));

5月21日星期二

我可能不知道年份,因为我试图在应用程序中查看日期,但有些日期可能是今年,有些可能是明年,但这些日期没有提供年份

下面的完整示例假设日期在从今天起的未来3年内,并检测星期几正确的年份。一旦成功,它就会以您想要的格式打印出来。

    String str = "Wed 20th May";
    ZoneId zone = ZoneId.of("Europe/London");
    LocalDate today = LocalDate.now(zone);
    int currentYear = today.getYear();
    LocalDate datetext = null;
    final int maxYearsFromToday = 3;
    for (int year = currentYear; year <= currentYear + maxYearsFromToday; year++) {
        DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
                .appendPattern("EEE d['st']['nd']['rd']['th'] MMMM")
                .parseDefaulting(ChronoField.YEAR, year)
                .toFormatter(Locale.ENGLISH);

        try {
            datetext = LocalDate.parse(str, parseFormatter);
            System.out.println("Day of week matched for year " + year);
            break;
        } catch (DateTimeParseException dtpe) {
            // Ignore, try next year
        }
    }

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("EEEE d MMMM", Locale.ENGLISH);
    if (datetext == null) {
        System.out.println("Could not parse date;"
                + " possibly the day of week didn’t match for any year in the range "
                + currentYear + " through " + (currentYear + maxYearsFromToday));
    } else if (datetext.isBefore(today) || datetext.isAfter(today.plusYears(maxYearsFromToday))) {
        System.out.println("Date is out of range");
    } else {
        System.out.println("Successfully parsed: " + datetext.format(outputFormatter));
    }
Day of week matched for year 2020
Successfully parsed: Wednesday 20 May
 类似资料:
  • 线程“main”java.time.format.DateTimeParseException中出现异常:无法在索引16处解析文本“14:30 Sat 05 May” 任何帮助都很感激。

  • 使用DateTimeFormatter仅解析LocalTime变量的“Time of Day”时出现问题。尝试了几种不同的格式,但没有看到我缺少了什么(我在想,既然我使用了DateTimeFormatter,我就需要一个date组件,但我只使用了LocalDate就没问题了,而且文档说它支持LocalTime)。 提前感谢任何帮助/链接,以确定我的错误导致异常。 使用此SSCCE复制: ...我得

  • 问题内容: 从DateTimeFormatter javadoc: 区域名称:时区名称(’z’)无法解析。 因此,时区解析如下: 在Joda中无法完成: 问题答案: 我认为原因是“ z”时区名称是常规名称(不是标准化的)且模棱两可;也就是说,根据您的原籍国,它们的含义不同。例如,“ PST”可以是“太平洋标准时间”或“巴基斯坦标准时间”。 如果您有兴趣,此站点上列出了大量时区名称。发现存在歧义的情

  • 问题内容: 我正在尝试使用Java 8 将格式化的字符串解析为对象。但是,我在解析某些输入字符串时遇到了一些问题。当我的输入字符串具有“ AM”时,它将正确解析,但是当我的字符串具有“ PM”时,它将引发异常。这是一个简单的例子: 输出: 因此可以正确解析,但是会在消息中抛出DateTimeParseException: 但是,这就是我遇到的问题。.我不太确定该错误的确切含义,但这绝对与输入字符串

  • 我对Groovy还比较陌生,我正试着去了解Gradle。如果我导入组织。jvnet。哈德逊。通过Grapes插件,它可以完美地工作,并且解决了依赖关系。但是,如果我尝试使用Gradle检索依赖关系,则依赖关系不会得到解决。 包适用于Gradle和Grape。 未使用Gradle解决的依赖关系 使用Grape解决的依赖关系 使用Gradle解决的依赖项 Gradle构建过程中的错误 build.gr