我试图从以下格式的字符串中只解析忽略工作日的时间:"星期一凌晨5点";
这是我的代码:
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"
我还建议设置Locale,这样你就有了正确的语言,并且它支持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点
如果我们想忽略这一天,那么我们可以使用以下模式:[
可选部分开始]
可选部分结束
这在解析和格式化时具有不同的行为。注意:在下面的代码中,解析和格式化使用了相同的模式。
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
对于格式化,如果数据不可用,则不会在输出中。
如果您只对时间感兴趣,为什么不从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));