Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有java库可以将描述时间度量的字符串(例如“1d 1m 1s”)转换为毫秒?_Java_Spring_String - Fatal编程技术网

是否有java库可以将描述时间度量的字符串(例如“1d 1m 1s”)转换为毫秒?

是否有java库可以将描述时间度量的字符串(例如“1d 1m 1s”)转换为毫秒?,java,spring,string,Java,Spring,String,在JIRA中设置问题估计值时,您可以输入一个字符串,如“1d 2h 30m”,JIRA将把它(我假设)转换为相应的毫秒数 是否有一个可用的Java库可以做到这一点 我使用的是一个Spring托管bean,它接受一个属性,该属性指示应该清除目录的频率,并且我希望允许配置使用人类可读的字符串,而不是显式的毫秒数 或者,如果我没有想到更好的方法,我很想听听。据我所知,没有。我相信你必须自己将这些数字转换成日历(GregorianCalendar),然后从那里开始计算毫秒,你可能已经知道了,这就是为什么

在JIRA中设置问题估计值时,您可以输入一个字符串,如
“1d 2h 30m”
,JIRA将把它(我假设)转换为相应的毫秒数

是否有一个可用的Java库可以做到这一点

我使用的是一个Spring托管bean,它接受一个属性,该属性指示应该清除目录的频率,并且我希望允许配置使用人类可读的字符串,而不是显式的毫秒数


或者,如果我没有想到更好的方法,我很想听听。

据我所知,没有。我相信你必须自己将这些数字转换成日历(GregorianCalendar),然后从那里开始计算毫秒,你可能已经知道了,这就是为什么你发布这篇文章,希望得到一个更好的答案

我的投票:如果没有其他人能找到一个,也许现在是自己开始一个并为社区做出贡献的好时机。:)

看一看。我本人从未使用过joda时间库的这一部分,但它似乎满足了您的需要


一般来说,对于日期/时间内容,请先查看joda time:)

解析器并不太复杂:

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;
}
公共静态长解析(字符串输入){
长结果=0;
字符串编号=”;
对于(int i=0;i

这段代码非常容错,它几乎忽略了任何它无法解码的东西(它忽略了任何whitspace,所以它接受“1d1s”、“1s1d”、“1d20m300s”等等)

这是另一个解决方案,它是可配置的:

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


也许对你当前的任务更有帮助:确定事情发生的频率。这种格式非常灵活,广为人知,易于理解。要驱动正在做周期性工作的bean,可以使用Quartz调度器、EJB3定时器注释或Spring定时器注释。

这是JodaTime API中的一个大漏洞-没有灵活的周期格式化程序/解析器API。只有一个想法-如果这不只是用于您正在构建的某些内部使用工具,无论您选择什么解决方案,都要考虑它将如何国际化。@Micheal D-这一点很好。请看一下JIRA源代码。;-)同意。我的想法正朝着这个方向发展。是的,如果我严格遵守格式,这是可行的,但对于“1d 2h”、“1d、2h、30m”和许多其他特殊情况,它都失败了
SimpleDataFormat
对于此类任务来说不够灵活。@Peter-谢谢,我已经在另一台机器上编写并测试了该部件,这是愚蠢的复制和命名错误;)我喜欢这个解析器。不过,您应该添加一点配置,以允许国际化指标。
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"));
}