我正在开发一个应用程序,用户以这种格式发送持续时间" YY:MM:DD:HH:mm:ss"例如1月2个月3天4小时5分钟6秒将被指定为
1:2:3:4:5:6
从这个值开始,我必须将持续时间转换为秒。我想知道是否有任何内置的java类来指定这种格式的持续时间?
答案 0 :(得分:1)
ISO 8601标准将时间跨度的字符串表示定义为PnYnMnDTnHnMnS
,其中P
标记开头,T
将日期部分与时间部分分开。< / p>
例如,“P3Y6M4DT12H30M5S”代表“三年六个月,四天,十二小时,三十分五秒”的持续时间。
一个半小时是PT1H30M
。
Joda-Time库具有Period类,默认情况下解析并生成该格式。
搜索StackOverflow了解更多信息。
答案 1 :(得分:0)
Java-8 引入了 java.time.Duration
和 java.time.Period
作为 JSR-310 implementation 的一部分,但是对于 ISO_8601#Durations 中指定的类型组合周期和持续时间已经等待了很长时间。< /p>
然而,javax.xml.datatype.Duration
从 Java-6 开始就已经存在,我们可以使用它来实现您想要的。假设您的文本始终采用 y:M:d:H:m:s
格式,例如1:2:3:4:5:6
。
演示:
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
public class Main {
public static void main(String[] args) throws DatatypeConfigurationException {
String[] durationParts = "1:2:3:4:5:6".split(":");
char[] symbols = "YMDHMS".toCharArray();
StringBuilder sb = new StringBuilder("P");
for (int i = 0; i < durationParts.length; i++) {
sb.append(durationParts[i]).append(symbols[i]);
if (i == 2) {
sb.append("T");
}
}
String strIso8601Duration = sb.toString();
System.out.println(strIso8601Duration);
Duration duration = DatatypeFactory.newInstance().newDuration(strIso8601Duration);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration.getTimeInMillis(calendar));
System.out.println(seconds);
}
}
输出:
P1Y2M3DT4H5M6S
36907506