所以我需要有一个用户输入“time expression”。
例如:
用户输入1w =>那一周=>到秒
用户输入1h =>那1小时=>到秒
用户输入2h10m =>这是2小时10分钟=>到秒
用户输入2h 10m =>那是2小时10分钟=>到秒
所以我的问题是:
你知道任何可以处理这个问题的java API /库吗?我需要解析像:
这样的值1y 1m 1w 2h 10m 15s。
或者我需要为此编写自己的解析器?
编辑:主要目标是将用户输入解析为更好的字符串。所以即时寻找解析器...而不是java代码如何将日期转换为秒或其他东西
感谢。
答案 0 :(得分:4)
不,你绝对不需要编写解析器。这样的解析器已经构建和测试,免费提供:Joda-Time库及其Period class。
存在一个国际标准,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 )
在日期时间数学中使用句点。构造一个日期时间(一年中的第一个),然后添加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提供了三个课程,以不同的方式表示时间跨度:Period,Interval和Duration。
我上面的例子使用了几周(1W
)。在进一步阅读时,似乎周数不是ISO 8601中的官方粒度级别。周仅用于单独使用(PnW
),而不是与其他元素结合使用。虽然我的代码似乎在Joda-Time中运行,但它可能不严格符合ISO 8601.我无法进一步调查,因为ISO标准已经关闭,只有昂贵的购买才可用。
答案 1 :(得分:1)
试用Java Joda Time库。