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

LocalDateTime无法分析“June”

公西财
2023-03-14
public LocalDateTime parseDate(String strDate, String strTime) {
    strTime = strTime + ":00";
    System.out.println("Date: " + strDate);
    System.out.println("Time: " + strTime);
    
    
    LocalDate date = LocalDate.now();
    DateTimeFormatter dtfForDate = new DateTimeFormatterBuilder()
                                    .parseCaseInsensitive()
                                    .parseDefaulting(ChronoField.YEAR, date.getYear())
                                    .appendPattern("d['th']['st']['rd']['nd'] MMM")
                                    .toFormatter(Locale.ENGLISH);

    DateTimeFormatter dtfForTime = DateTimeFormatter.ofPattern("H:m:s", Locale.ENGLISH);
    
    LocalDateTime ldt = LocalDate.parse(strDate, dtfForDate)
                                    .atTime(LocalTime.parse(strTime, dtfForTime));
    System.out.println("Local Date Time: " + ldt);
    
    return ldt;
}
Date: 1st June

Time: 9:15:00

共有1个答案

宁鹏程
2023-03-14

使用下面的模式来兼顾这两种情况:三个字母的缩写月份名称和完整的月份名称:

.appendPattern("d['th']['st']['rd']['nd'] [MMMM][MMM]")

演示:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        System.out.println(parseDate("1st June", "9:15:00"));
        System.out.println(parseDate("1st Jun", "9:15:00"));
    }

    public static LocalDateTime parseDate(String strDate, String strTime) {
        LocalDate date = LocalDate.now();
        DateTimeFormatter dtfForDate = new DateTimeFormatterBuilder()
                                        .parseCaseInsensitive()
                                        .parseDefaulting(ChronoField.YEAR, date.getYear())
                                        .appendPattern("d['th']['st']['rd']['nd'] [MMMM][MMM]")
                                        .toFormatter(Locale.ENGLISH);

        DateTimeFormatter dtfForTime = DateTimeFormatter.ofPattern("H:m:s", Locale.ENGLISH);

        LocalDateTime ldt = LocalDate.parse(strDate, dtfForDate).atTime(LocalTime.parse(strTime, dtfForTime));

        return ldt;
    }
}

输出:

2021-06-01T09:15
2021-06-01T09:15
 类似资料:
  • 问题内容: 我只是想将Java 8中的日期字符串转换为DateTime对象。运行以下行时: 我收到以下错误: 语法与此处建议的语法相同,但有例外。我正在使用JDK-8u25。 问题答案: 事实证明Java不接受裸露的Date值作为DateTime。使用LocalDate代替LocalDateTime解决了此问题:

  • 我得到以下错误: 语法与这里所建议的相同,但我有一个例外。我使用的是。

  • 问题内容: 我想在客户端验证日期,因此编写了以下代码。但是我没有得到异常,而是得到了2月31日日期字符串的正确日期对象,这显然是无效的日期。 输出 :2015-02-28T11:30:59 有谁知道为什么要解析这个日期而不是抛出异常。 问题答案: 您只需要严格。 解析文本字符串分为两个阶段。阶段1是根据添加到构建器中的字段进行的基本文本解析。阶段2将解析的字段值对解析为日期和/或时间对象。此样式用

  • 我不像本例中那样使用以周为基础的年份。 最后,与这里不同的是,我使用的是LocalDateTime,所以时区应该不是问题。但是,由于这可能是DateTimeFormatter中的一个bug,我尝试将格式化程序传递为'formatter.WithZone(zoneId.SystemDefault())'(建议的解决方法),结果导致了相同的异常。

  • 问题是: 格式如下:2015-10-23T03:34:40 当我试图这样解决问题时: 我在另一个地方遇到问题。Java需要在我的服务calass中将type更改为String类型: 如果我将更改为,则无法使用方法plusDay(1):((( 我也尝试了这样的方法: 格式与字符相同' T' 2018-09-13T05:42:28 这种方式也不适合我: 因为a不能将类型改为字符串 这种方式不起作用,因