当前位置: 首页 > 知识库问答 >
问题:

在Java中解析时间段

后安民
2023-03-14

我希望能够解析一段时间(天、小时、分钟)可选字符串,以便输入如下:

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

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

编辑:输入示例:

12h64m - 正确

12d43mdsd-正确

-空字符串-不正确

12m-正确

12d32h43m - 正确

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


共有2个答案

柴兴修
2023-03-14

(?

楚和悌
2023-03-14
Duration.parse( 
    "P"
    .concat( "12d32h43m".replace( "d" , "DT" ) )
    .toUpperCase()
).toHoursPart()

8.

你说:

据我所知,正则表达式是处理这类事情的合适工具

不。不需要正则表达式。

  • 有一个类:持续时间
  • 为这些值定义了一个标准格式:PnYnMnDTnHnMnS

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

P标志着开始。T将任何年-月-日与任何小时-分钟-秒分开。

转换输入以符合标准。

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

P12DT32H43M

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

你可以询问每个部分。调用<code>到Java 9中添加的</code>方法的…部分。对于Java 8,请参阅此问题和此问题。

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小时=一天)。

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 

输入:P12DT32H43M

d、 toString()PT320H43M

第13天

小时部分: 8

小时总数:320

对小时-分钟-秒值使用持续时间。对年-月-日值使用周期

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

java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.DateCalendar

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。

使用与 JDBC 4.2 或更高版本兼容的 JDBC 驱动程序,您可以直接与数据库交换 java.time 对象。不需要字符串,也不需要java.sql.*类。

从哪里获取 java.time 类?

  • Java SE 8、Java SE 9 及更高版本
    • 内置。
    • 具有捆绑实现的标准 Java API 的一部分。
    • Java 9 添加了一些小功能和修复。
    • 许多java.time功能被反向移植到Java6
    • Android的更高版本是java的捆绑实现。上课时间到了
    • 对于早期的Android,ThreeTenABP项目采用了ThreeTen Backport(如上所述)。了解如何使用ThreeTenABP

    ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

 类似资料:
  • 问题内容: 我有一个系统(用Python开发),它接受 datetime作为各种格式的字符串 ,我必须 解析 它们。当前datetime字符串格式是: 现在我想要一个可以在适当的datetime对象中转换任何这些datetime格式的 通用解析器… 否则,我必须单独分析它们。因此,还请提供单独解析它们的方法(如果没有通用解析器)。 问题答案: 正如@TimPietzcker所建议的那样,dateu

  • 问题内容: 我有这些日期字符串: 我想将它们转换为UTC。我已经尝试过此实现: 但是我得到了: 有任何想法吗? 问题答案: 使用parsedatetime库。

  • 问题内容: 我正在尝试解析json请求中的Datetime。该请求看起来像这样: 它被解码成的结构看起来像这样: 解码行如下所示: Revel返回此错误: 根据此处的revel文档,https://revel.github.io/manual/parameters.html 在同一文档中,他们还说您可以附加如下格式: 为了验证格式是否在数组中,我尝试了以下方法: 在绝望的最后一幕中,我尝试以rev

  • 问题内容: 我有一个日期时间字符串,我不知道如何在Python中解析它。 字符串是这样的: 我试过了 但是Python引发 根据Python文档: %z UTC偏移量,格式为+ HHMM或-HHMM(如果对象是天真对象,则为空字符串)。 解析此时间字符串的正确格式是什么? 问题答案: 时区解析有问题。看一下包装:

  • 我对java时间中的时间处理感到困惑。长期以来,我一直在这样一种假设下工作,即如果将时间戳指定为祖鲁时间,java将处理与本地时间相关的偏移量。 来说明。我目前在BST,它有UTC 1的偏移量。考虑到这一点,我希望这个祖鲁语时间: 成为 解析后的LocalDateTime。这是因为我的默认systemtime设置为BST,并且上面的时间戳(zulu time)指定它是UTC时间。 然而,请考虑这个