Java 包含转换为秒的时间(1H4M10S)的字符串
我想将一个类似于“5W3D10H5M10S”的字符串转换为秒,当将上一个字符串作为参数时,函数将返回“3319510”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
- 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