我有一个格式如下的字符串:“ 2h 33m 50s”。如果小时数达到零,则此字符串更改为:“ 33m 50s”。因此,如果此字符串通过LocalTime.parse,则会引发异常。我该如何解析?
ninja
fun main() {
val timeString = "2h 33m 50s"
val timeString2 = "33m 50s"
val formatterH = DateTimeFormatter.ofPattern("[H]'h 'm[m]'m 's[s]'s'")
val formatterM = DateTimeFormatter.ofPattern("m[m]'m 's[s]'s'")
val time = LocalTime.parse(timeString, formatterH)
println(time)
val time2 = LocalTime.parse(timeString2, formatterH) //throws exception
println(time2)
val time3 = LocalTime.parse(timeString2, formatterM) //throws similar exception
println(time3)
}
答案 0 :(得分:5)
您太努力了,走错了方向。
正则表达式对于解决此问题是过大的。
不需要DateTimeFormatter
类,也不需要格式化模式。
使用Duration
类来解析根据您的输入制作的ISO 8601字符串。
Duration // Represent a span-of-time not attached to the timeline with class `Duration`, not `LocalTime`.
.parse( // By default, the *java.time* classes such as `Duration` use the standard ISO 8601 formats to parse/generate date-time strings.
"PT" + "2h 33m 50s" // Morph your input string to comply with the ISO 8601 standard. Add `P` for the beginning, and `T` to separate years-months-days from hours-minutes-seconds.
.replace( " " , "" ) // Delete any SPACE characters by replacing them with nothing.
.toUpperCase() // Force all the letters to be uppercase.
) // Returns a `Duration`.
同上仅需几分钟和几秒钟。
Duration.parse( "PT" + "33m 50s".replace( " " , "" ).toUpperCase() )
Duration
,而不是LocalTime
如果此字符串通过LocalTime.parse
LocalTime
是一天中的某个时间。您输入的不是一天中的时间。
您的输入字符串表示未附加到时间轴的时间跨度。该类是Duration
。
您的输入字符串接近standard ISO 8601格式,PnYnMnDTnHnMnS
。 P
标志着开始。 T
将任何年月日与任何时分秒分开。
让我们调整您的输入字符串以符合标准。
String input = "PT" + "2h 33m 50s".replace( " " , "" ).toUpperCase() ;
输入:PT2H33M50S
解析。
Duration d = Duration.parse( input ) ; // PT2H33M50S
要在标准ISO 8601中生成字符串,请调用toString
。
String output = d.toString() ;
输出:PT2H33M50S
您可以将Duration
对象添加到一天中的某个时间,LocalTime
。
LocalTime lt = LocalTime.NOON.plus( d ) ;
您可以将Duration
添加到UTC的当前时刻,以确定未来时刻(或者过去时刻是持续时间为负数)。
Instant instant = Instant.now().plus( d ) ;
lt.toString():14:33:50
请参阅以上所有code run live at IdeOne.com。
您可以提取Duration
的每个部分。
long daysPart = d.toDaysPart() ; // 24-hour chunks of time, not related to calendar days.
int hoursPart = d.toHoursPart() ;
int minutesPart = d.toMinutesPart() ;
int secondsPart = d.toSecondsPart() ;
或者您可能希望将整个时间跨度计为总毫秒数。
long millis = d.toMillis() ; // All the hours-minutes-seconds and such totaled as one count of elapsed milliseconds.
答案 1 :(得分:0)
使用模式"[H'h ']m'm 's's'"
,它将同时解析两者。
[H'h ']
匹配可选的小时数,例如"2h "
m'm '
匹配"33m "
s's'
匹配"50s"