在JIRA中设置问题估算时,您可以输入类似"1d 2h 30m"
的字符串,JIRA会将此(我假设)转换为相应的毫秒数。
是否有可用的Java库?
我正在使用Spring托管bean,它接受一个属性来指示应该清除目录的频率,并且我希望允许配置采用人类可读的字符串而不是明确的毫秒数。 / p>
或者,如果有一种我没想到的更好的方法,我很乐意听到它。
答案 0 :(得分:6)
解析器不太复杂:
public static long parse(String input) {
long result = 0;
String number = "";
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (Character.isDigit(c)) {
number += c;
} else if (Character.isLetter(c) && !number.isEmpty()) {
result += convert(Integer.parseInt(number), c);
number = "";
}
}
return result;
}
private static long convert(int value, char unit) {
switch(unit) {
case 'd' : return value * 1000*60*60*24;
case 'h' : return value * 1000*60*60;
case 'm' : return value * 1000*60;
case 's' : return value * 1000;
}
return 0;
}
代码非常容错,它几乎忽略了它无法解码的任何东西(它忽略了任何空格,因此它接受“1d 1s”,“1s 1d”,“1d20m300s”等等)。
答案 1 :(得分:3)
这是另一个解决方案,这个可配置:
public class TimeReader{
private final Map<String, Long> units = new HashMap<String, Long>();
private static final String UNIT_PATTERN = "\\w+";
private static final Pattern ITEM_PATTERN = Pattern.compile("(\\d+)\\s*("
+ UNIT_PATTERN + ")");
/**
* Add a new time unit.
*
* @param unit
* the unit, e.g. "s"
* @param value
* the unit's modifier value (multiplier from milliseconds, e.g.
* 1000)
* @return self reference for chaining
*/
public TimeReader addUnit(final String unit, final long value){
if(value < 0 || !unit.matches(UNIT_PATTERN)){
throw new IllegalArgumentException();
}
units.put(unit, Long.valueOf(value));
return this;
}
/**
* Parse a string using the defined units.
*
* @return the resulting number of milliseconds
*/
public long parse(final String input){
long value = 0l;
final Matcher matcher = ITEM_PATTERN.matcher(input);
while(matcher.find()){
final long modifier = Long.parseLong(matcher.group(1));
final String unit = matcher.group(2);
if(!units.containsKey(unit)){
throw new IllegalArgumentException("Unrecognized token: "
+ unit);
}
value += units.get(unit).longValue() * modifier;
}
return value;
}
}
样本使用:
public static void main(final String[] args){
final TimeReader timeReader =
new TimeReader()
.addUnit("h", 3600000l)
.addUnit("m", 60000l)
.addUnit("s", 1000l);
System.out.println(timeReader.parse("3h, 2m 25 s"));
}
<强>输出:强>
10945000
答案 2 :(得分:1)
查看joda-time的PeriodConverter。我自己从未使用过joda-time库的这一部分,但看起来它可以满足您的需求。
一般来说,对于日期/时间的东西,首先看看joda-time:)
答案 3 :(得分:0)
据我所知,没有。我相信你必须自己将这些数字转换成日历(GregorianCalendar),然后从那里你可以继续获得毫秒,你可能已经知道这就是为什么你发布这个数据以期得到更好的答案。
我的投票:如果没有其他人可以找到,现在也许是自己创办一个并为社区做贡献的好时机。 :)
答案 4 :(得分:0)
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("dd'd' HH'h' mm'm'");
try {
Date d = df.parse("1d 2h 30m");
System.out.println(d.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
答案 5 :(得分:0)
也许cron expressions会对您当前的任务更有帮助:规定事情应该发生的频率。这种格式非常灵活,众所周知和理解。要驱动正在进行定期编排的bean,可以使用Quartz调度程序,EJB3计时器注释或Spring计时器注释。