gpt4 book ai didi

Java 时间表达式求值

转载 作者:行者123 更新时间:2023-12-01 17:10:00 26 4
gpt4 key购买 nike

所以我需要让用户输入“时间表达式”。

例如:

  • 用户输入 1w => 即 1 周 => 秒

  • 用户输入 1h => 即 1 小时 => 秒

  • 用户输入 2h10m => 即 2 小时 10 分钟 => 转换为秒

  • 用户输入 2h 10m => 即 2 小时 10 分钟 => 秒

所以我的问题是:

你知道有什么java API/库可以处理这个问题吗?我需要解析值,例如:

1y 1m 1w 2h 10m 15s。

或者我需要为此编写自己的解析器?

编辑:主要目标是将用户输入解析为更好的字符串。所以我在寻找解析器...而不是java代码如何将日期转换为秒或其他东西

谢谢。

最佳答案

不要自己动手

不,你绝对不需要编写解析器。这样的解析器已经构建并测试,可以免费使用:Joda-Time图书馆及其Period class .

ISO 8601

存在国际标准,ISO 8601 ,定义与您正在使用的类似的文本格式。该标准称为format Durations : PnYnMnDTnHnMnS 其中 P 代表周期(是的,术语在日期时间工作中有所不同和冲突)。 T 是日期部分和时间部分之间的分隔符。

乔达时间

默认情况下,Joda-Time 类 period 都会解析并生成此格式。

Joda-Time 2.3 中的示例代码。

使用内置默认解析器构建解析 ISO 8601 格式的字符串。

String input = "P1Y1M1WT2H10M15S";
Period period = new Period( input );

使用 ISO 8601 格式的内置默认格式化程序创建字符串。

String output = period.toString();  

使用备用构造函数,传递每个字段的整数。

Period period2 = new Period( 1, 1, 1, 0, 2, 10, 15, 0 ); // Period( int years, int months, int weeks, int days, int hours, int minutes, int seconds, int millis )

在日期时间数学中使用句点。构造一个日期时间(一年中的第一天),然后添加期间以得出另一个日期时间。请注意使用特定时区,而不是依赖 JVM 的默认时区。

DateTime dateTime = new DateTime( 2014, DateTimeConstants.JANUARY, 1, 0, 0, 0, DateTimeZone.forID( "Europe/Paris" ));
DateTime dateTimeLater = dateTime.plus( period );

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "output: " + output );
System.out.println( "period2: " + period2 );
System.out.println( "Seconds portion: " + period.getSeconds() );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeLater: " + dateTimeLater );

运行时...

input: P1Y1M1WT2H10M15S
output: P1Y1M1WT2H10M15S
period2: P1Y1M1WT2H10M15S
Seconds portion: 15
dateTime: 2014-01-01T00:00:00.000+01:00
dateTimeLater: 2015-02-08T02:10:15.000+01:00

顺便说一下,Joda-Time 提供了三个类来以不同的方式表示时间跨度:Period , Interval ,和Duration .

警告 - 几周

我上面的示例使用了几周(1W)。进一步阅读后发现,周并不是 ISO 8601 中的官方粒度级别。周只能单独使用 (PnW),不能与其他元素结合使用。虽然我的代码似乎可以在 Joda-Time 中运行,但它可能不严格符合 ISO 8601。我无法进一步调查,因为 ISO 标准已关闭,只有通过昂贵的购买才能获得。

关于Java 时间表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24186801/

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