Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从包含weekname和time的字符串分析时间_Java_Java Time - Fatal编程技术网

Java 从包含weekname和time的字符串分析时间

Java 从包含weekname和time的字符串分析时间,java,java-time,Java,Java Time,我试图用以下格式解析字符串中唯一忽略weekday的时间:“Monday 5AM” 这是我的密码: String dateTxt = "Monday 5AM"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ha"); LocalTime lt = LocalTime.parse(dateTxt, formatter); 它抛出一个异常: java.time.format.DateT

我试图用以下格式解析字符串中唯一忽略weekday的时间:“Monday 5AM”

这是我的密码:

String dateTxt = "Monday 5AM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ha");
LocalTime lt = LocalTime.parse(dateTxt, formatter);
它抛出一个异常:
java.time.format.DateTimeParseException:无法分析文本“星期六凌晨1点”


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

您需要将格式更改为

"EEEE ha"
我还建议您设置区域设置,这样您就可以使用正确的语言,并且它支持AM/PM

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

如果您只需要从parse
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点


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

String dateTxt=“星期一上午5点”;
DateTimeFormatterBuilder dtfb=新的DateTimeFormatterBuilder();
DateTimeFormatter fmtr=dtfb.appendValue(ChronoField.CLOCK\u HOUR\u OF\u AMPM)
.appendText(ChronoField.AMPM_OF_DAY,TextStyle.SHORT)
.toFormatter(Locale.ENGLISH);
字符串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

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

即使您不关心工作日,也需要告诉解析器希望工作日出现在输入中,否则它将不知道如何处理文本。换句话说:格式字符串描述的是您希望显示的文本,而不是您关心的数据。由于day被忽略(可选),可以使用此模式
[EEEE]ha
<代码>[和
]
表示可选部分。谢谢,但这不是问题所在,是吗?当输入字符串可能包括也可能不包括工作日时,您的格式可用。@onkarruikar我不知道[]表示可选。干杯,伙计。是的,另一个解决方案是从字符串中提取时间并对其进行解析,但您的代码看起来太复杂,难以阅读。我可以使用正则表达式提取时间,它将是一行代码。@Sarvarisonboev答案的要点是演示如何使用class
DateTimeFormatterBuilder
作为直接使用class
DateTimeFormatter
的替代方法。虽然可能有些过火,但这可能会让未来的问答访问者受益。拆分日期字符串不会对区域设置敏感(我只建议在不想验证一周中的某一天是否为有效的一周中的某一天时使用这种方法。这意味着在大多数情况下,验证将是一个加号,而不是要避免的东西。@sarvarisonboev
dateTxt.split(“”[1]
也是一行,而且比最简单的正则表达式更容易阅读。现在我明白你对我的答案的评论的意思了,同样的格式化程序也可以重复用于输出。很好!