在java中指定持续时间

时间:2015-03-05 10:03:20

标签: java date time calendar duration

我正在开发一个应用程序,用户以这种格式发送持续时间" YY:MM:DD:HH:mm:ss"例如1月2个月3天4小时5分钟6秒将被指定为

  

1:2:3:4:5:6

从这个值开始,我必须将持续时间转换为秒。我想知道是否有任何内置的java类来指定这种格式的持续时间?

2 个答案:

答案 0 :(得分:1)

ISO 8601标准将时间跨度的字符串表示定义为PnYnMnDTnHnMnS,其中P标记开头,T将日期部分与时间部分分开。< / p>

例如,“P3Y6M4DT12H30M5S”代表“三年六个月,四天,十二小时,三十分五秒”的持续时间。

一个半小时是PT1H30M

Joda-Time库具有Period类,默认情况下解析并生成该格式。

搜索StackOverflow了解更多信息。

答案 1 :(得分:0)

Java-8 引入了 java.time.Durationjava.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