gpt4 book ai didi

java - 在Java中解析时间段

转载 作者:行者123 更新时间:2023-11-29 04:21:20 25 4
gpt4 key购买 nike

我希望能够解析时间段(天、小时、分钟)+ 可选字符串,因此输入如下所示:<time>(white_spaces)<optional_string> .据我所知,正则表达式是处理这些事情的正确工具,所以我想出了这样的表达方式:

Pattern.compile("((?<days>\\d+)d)?((?<hours>\\d+)h)?((?<minutes>\\d+)m)?\\s+?(?<reason>.+)?");

基本上它按预期工作,但是在此表达式中,所有时间组(天、小时、分钟)都是可选的,我希望输入至少包含分钟组。但是,如果指定了小时或天,则不需要分钟。此外,时间组的所有组合(d+h、h+m、d+m、d+h+m)都是可能的。那么我该如何纠正我的表情呢?或者也许还有其他方法来解析时间段?

编辑:输入示例:

12h64m - 正确

12d43m dsd - 正确

- 空字符串 - 不正确

12m - 正确

12d32h43m - 正确

sdsds - 不正确 - 没有“指定时间组”

最佳答案

tl;dr

Duration.parse( 
"P"
.concat( "12d32h43m".replace( "d" , "DT" ) )
.toUpperCase()
).toHoursPart()

8

你说:

As i know regex is the right tool for such things

没有。 不需要正则表达式。

ISO 8601

您的输入字符串格式接近 ISO 8601 正式定义的格式标准:PnYnMnDTnHnMnS

P 标记开始。 T 将任何年-月-日与任何时-分-秒分开。

转换您的输入以符合标准。

String input =  "P".concat( "12d32h43m".replace( "d" , "DT" ) ).toUpperCase() ;

P12DT32H43M

java.time

Java 有一个类,Duration (和 Period )。不需要正则表达式。

您可以查询每个部分。调用在 Java 9 中添加的 to…Part 方法.对于 Java 8,请参阅 this Questionthis Question .

long daysPart = d.toDaysPart() ;
int hoursPart = d.toHoursPart() ;

整个例子:

String input = "P".concat( "12d32h43m".replace( "d" , "DT" ) ).toUpperCase();
Duration d = Duration.parse( input );
long daysPart = d.toDaysPart();
int hoursPart = d.toHoursPart();
long hoursTotal = d.toHours(); // Total elapsed hours of entire duration.

转储到控制台。注意数学。您输入的 32 小时被重新计算为 8,天数从 12 变为 13(额外的 24 小时 block = 一天)。

System.out.println( "input: " + input );
System.out.println( "d.toString()" + d );
System.out.println( "daysPart: " + daysPart ); // 13, not the 12 days seen in the input string. 24 hours were taken from the excessive `32h` of the input string, leaving 8 in the hours part.
System.out.println( "hoursPart: " + hoursPart );
System.out.println( "hoursTotal: " + hoursTotal ); // ( ( 13 * 24 ) + 8 ) = ( 312 + 8 ) = 320

input: P12DT32H43M

d.toString()PT320H43M

daysPart: 13

hoursPart: 8

hoursTotal: 320

DurationPeriod

使用Duration小时-分钟-秒值。使用 Period年-月-日值。

  • Duration 中,“天”被理解为与日期和日历无关的 24 小时通用 block 。
  • 如果您需要日期,您应该使用Period 类。
  • 如果两者都想要,请再考虑一下。混合这两个概念通常没有意义,尽管乍一看这似乎有悖常理。但如果您坚持,请参阅 PeriodDuration ThreeTen-Extra 中可用的类项目。

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

使用 JDBC driver符合 JDBC 4.2或者稍后,您可以直接与数据库交换 java.time 对象。不需要字符串或 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 在Java中解析时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48964365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com