从包含周名和时间的字符串中解析时间

Parse time from string that contains weekname and time

我正在尝试仅从具有以下格式的字符串中忽略工作日的时间进行解析:“Monday 5AM”

这是我的代码:

String dateTxt = "Monday 5AM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ha");
LocalTime lt = LocalTime.parse(dateTxt, formatter);

它抛出一个异常: java.time.format.DateTimeParseException: Text 'Saturday 1AM' could not be parsed

如何从该字符串中仅解析时间?

您需要将格式更改为

"EEEE ha"

我还建议您设置区域设置,这样您就有了正确的语言并且它支持 AM/PM

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE ha", Locale.ENGLISH);

我看到这个问题现在已经被编辑了,如果你只想要时间,你可以从解析 LocalTime 对象

中提取或格式化它
LocalTime lt = LocalTime.parse(dateTxt, formatter);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("h a", Locale.ENGLISH);
System.out.println(lt);
System.out.println(lt.format(formatter2));

05:00
5 AM

如果您只对时间感兴趣,为什么不直接从 dateTxt 中提取该部分并仅解析该部分。

String dateTxt = "Monday 5AM";
DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
DateTimeFormatter fmtr = dtfb.appendValue(ChronoField.CLOCK_HOUR_OF_AMPM)
                             .appendText(ChronoField.AMPM_OF_DAY, TextStyle.SHORT)
                             .toFormatter(Locale.ENGLISH);
String timeTxt = dateTxt.split(" ")[1];
System.out.println(LocalTime.parse(timeTxt, fmtr));

如果我们想忽略这一天,那么我们可以使用以下模式:
[ 可选部分开始
] 可选部分结束

这在解析和格式化时有不同的行为。注意:相同的模式已用于以下代码中的解析和格式化。

    String dateTxt = "Monday 5AM";
    //for parsing day of week is ignored
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[EEEE ]ha", Locale.ENGLISH);
    LocalTime lt = LocalTime.parse(dateTxt, formatter);
    System.out.println(lt + " - parsed local time ");
    
    //in case of formatting if data is not available 
    //then the field won't be in output
    System.out.println(lt.format(formatter) + " -local time with optnal day in format.");
    
    //the day is available so it will be there in output
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt.format(formatter) + " -local date time with optnal day in format");

输出:

05:00 - parsed local time 
5AM -local time with optnal day in format.
Saturday 2PM -local date time with optnal day in format

用于格式化,如果数据不可用则不会输出。