我希望能够解析一段时间(天、小时、分钟)可选字符串,以便输入如下:
Pattern.compile("((?<days>\\d+)d)?((?<hours>\\d+)h)?((?<minutes>\\d+)m)?\\s+?(?<reason>.+)?");
基本上,它可以按预期工作,但是在这个表达式中,所有时间组(天、小时、分钟)都是可选的,我希望输入至少包含分钟组。但是,如果指定了小时或天,则不需要分钟。此外,时间组的所有组合(dh、hm、dm、dhm)都是可能的。那么我该如何纠正我的表达呢?或者也许有其他方法来解析时间段?
编辑:输入示例:
12h64m
- 正确
12d43mdsd
-正确
-空字符串-不正确
12m
-正确
12d32h43m
- 正确
sdsds
- 不正确 - 未指定“时间组”
(?
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 小时的通用块。 期间
类。 PeriodDuration
类。java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date
,Calendar
,
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
使用与 JDBC 4.2 或更高版本兼容的 JDBC 驱动程序,您可以直接与数据库交换 java.time 对象。不需要字符串,也不需要java.sql.*类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。
问题内容: 我有一个系统(用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时间。 然而,请考虑这个