Java 包含转换为秒的时间(1H4M10S)的字符串

Java 包含转换为秒的时间(1H4M10S)的字符串,java,time,Java,Time,我想将一个类似于“5W3D10H5M10S”的字符串转换为秒,当将上一个字符串作为参数时,函数将返回“3319510” W=周(s) D=天(s) H=小时(s) M=分钟(s) S=秒(S) 我一直在想办法,但如果有人能给我指出正确的方向,那么没有一种方法是有效的。你可以通过一个regexp和一个简单的循环来实现: private static final int[] timeMul = new int[] {7, 24, 60, 60, 1}; private static final

我想将一个类似于“5W3D10H5M10S”的字符串转换为秒,当将上一个字符串作为参数时,函数将返回“3319510”

  • W=周(s)
  • D=天(s)
  • H=小时(s)
  • M=分钟(s)
  • S=秒(S)

我一直在想办法,但如果有人能给我指出正确的方向,那么没有一种方法是有效的。

你可以通过一个regexp和一个简单的循环来实现:

private static final int[] timeMul = new int[] {7, 24, 60, 60, 1};
private static final Pattern rx = Pattern.compile(
    "(?:(\\d+)W)?(?:(\\d+)D)?(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?"
);
public static int getSeconds(String str) {
    Matcher m = rx.matcher(str);
    if (!m.find()) {
        return -1;
    }
    int res = 0;
    for (int i = 0 ; i != m.groupCount() ; i++) {
        String g = m.group(i+1);
        res += g == null ? 0 : Integer.parseInt(g);
        res *= timeMul[i];
    }
    return res;
}

最简单的方法是简单地循环文本,直到它到达一个非数字字符,然后取上一个字符位置的子字符串,得到该部分文本,将其解析为int,并根据字符将其乘以所需的数量

例如:

public long getSeconds(String funnyFormat) 
{
    long seconds = 0;
    int lastIndex = 0;
    for(int i = 0;i<funnyFormat.length;i++) {
        char cur = funnyFormat.charAt(i);
        if(cur < '0' && cur > '9') {
            //If it's not a Number
            int seg = Integer.parseInt(funnyFormat.substring(lastIndex,i));
            lastIndex = i+1;
            switch(cur){
            case 'H':
                long += seg*3600;
                break;
            case 'M':
                long += seg*60;
                break;
            case 'S':
                long += seg;
                break;
            //And so on and so forth
            }
        }
    }
}
public long getSeconds(字符串funnyFormat)
{
长秒=0;
int lastIndex=0;
对于(int i=0;i'9'){
//如果不是一个数字
int seg=Integer.parseInt(funnyFormat.substring(lastIndex,i));
lastIndex=i+1;
开关(cur){
案例“H”:
长+=seg*3600;
打破
案例“M”:
长+=seg*60;
打破
案例S:
长+=seg;
打破
//等等等等
}
}
}
}

您可以借助正则表达式将其解析回来,请参见下面的Java 7实现:

    String str = "5W3D10H5M10S";
    String pat = "((?<week>\\d+)W)?((?<day>\\d+)D)?((?<hour>\\d+)H)?((?<min>\\d+)M)?((?<sec>\\d+)S)?";

    Matcher m = Pattern.compile (pat).matcher(str);

    if(m.matches()) {
        int week = Integer.parseInt( m.group("week") );
        int day  = Integer.parseInt( m.group("day") );
                    //And so on ..
    }
String str=“5W3D10H5M10S”;
字符串pat=“(?\\d+W)-(?\\d+d)-(?\\d+H)-(?\\d+M)-(?\\d+S)”;
Matcher m=Pattern.compile(pat).Matcher(str);
如果(m.matches()){
int week=Integer.parseInt(m.group(“week”);
int day=Integer.parseInt(m.group(“day”));
//等等。。
}

您必须调整此选项,以处理一些边界条件和意外输入

long wdh(String fmt) {

    long tot = 0;
    int current = 0;
    for (char c : fmt.toCharArray()) {

        if (Character.isDigit(c)) {
            current *= 10;
            current += c - '0';
            continue;
        }

        switch (c) {

            case 'W': tot += WEEK_SECONDS * current; current = 0; continue;
            case 'D': tot += DAY_SECONDS * current; current = 0; continue;
            case 'H': tot += HOUR_SECONDS * current; current = 0; continue;
            case 'M': tot += MINUTE_SECONDS * current; current = 0; continue;
            case 'S': tot += current; break;
        }
    }

    return tot;
}

将字符串转换为表达式,让
ScriptEngineManager
进行计算,怎么样

public void testIt() throws Exception {
        final String in = "5W3D10H5M10S";
        final String after = in.replaceAll("W", "*7D").
                replaceAll("D", "*24H").
                replaceAll("H", "*60M").
                replaceAll("M", "*60+").
                replaceAll("S", "");
        final ScriptEngineManager manager = new ScriptEngineManager();
        final ScriptEngine engine = manager.getEngineByName("js");
        final Object result = engine.eval(after);
        System.out.println("Result:" + String.valueOf(result));
    }
输出:

Result:3319510.0

编辑:稍微简化(减少字符串操作)

DateFormat DateFormat=newsimpledateformat(“d'd'HH'H'mm'M'ss'”);
dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT”);
String dateString=“5W3D10H5M10S”;
String[]dateAndWeek=dateString.split(“W”);
Calendar cal=Calendar.getInstance(TimeZone.getTimeZone(“GMT”));
cal.setTime(dateFormat.parse(dateAndWeek[1]);
计算添加(日历日期,1);
cal.add(Calendar.WEEK/u OF/u YEAR,Integer.parseInt(dateAndWeek[0]);

long dateSeconds=cal.getTimeInMillis()/1000//您可以拆分字符串并按单位进行计算:5w=5*7*24*3600秒等等,这不会比拆分字符串并进行乘法更有效。没有捷径可走,你只需要编写代码。我想可能有一个这样的函数已经在java中实现了,或者它的一个小类。有趣的是,我试着用
SimpleDateFormat sdf=new SimpleDateFormat(“w'D'K'H'm's”)来实现这个函数;Date myDate=sdf.parse
,因为他正在寻找一个预构建的Java函数,但它不起作用。我想知道为什么。。。(我把它放在try/catch块中,但它只是给出了一个非常错误的数字。奇怪)。我还建议将正则表达式本身构建在一个循环中,使用
String.format
,我认为这样更容易理解。@BlackVoid:我用日历函数实现了这种模式。如果你正在寻找这种方法,我相信,我可以更好地简化它。这非常适合我,因为你输入时间的顺序无关紧要。谢谢
    DateFormat dateFormat = new SimpleDateFormat("d'D'HH'H'mm'M'ss'S'");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    String dateString = "5W3D10H5M10S";
    String[] dateAndWeek = dateString.split("W");
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    cal.setTime(dateFormat.parse(dateAndWeek[1]));
    cal.add(Calendar.DATE, 1);
    cal.add(Calendar.WEEK_OF_YEAR, Integer.parseInt(dateAndWeek[0]));
    long dateSeconds = cal.getTimeInMillis()/1000;//<--3319510