Java时间表达式评估

时间:2014-06-12 14:21:47

标签: java datetime

所以我需要有一个用户输入“time expression”。

例如:

  • 用户输入1w =>那一周=>到秒

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

  • 用户输入2h10m =>这是2小时10分钟=>到秒

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

所以我的问题是:

你知道任何可以处理这个问题的java API /库吗?我需要解析像:

这样的值

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

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

不要自己动手

不,你绝对不需要编写解析器。这样的解析器已经构建和测试,免费提供:Joda-Time库及其Period class

ISO 8601

存在一个国际标准,ISO 8601,定义与您正在使用的文本格式类似的文本格式。该标准调用format DurationsPnYnMnDTnHnMnS,其中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 )

在日期时间数学中使用句点。构造一个日期时间(一年中的第一个),然后添加Period以到达另一个日期时间。请注意使用特定时区而不是依赖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提供了三个课程,以不同的方式表示时间跨度:PeriodIntervalDuration

警告 - 周

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

答案 1 :(得分:1)

试用Java Joda Time库。