【问题标题】:Specifying time duration in java在java中指定持续时间
【发布时间】:2015-03-05 10:03:19
【问题描述】:

我正在开发一个应用程序,其中用户以这种格式发送持续时间“YY:MM:DD:HH:mm:ss”ex。 1yr 2months 3days 4hrs 5mins 6sec 将被指定为

1:2:3:4:5:6

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

【问题讨论】:

  • 使用 SimpleDateFormate,然后将日期转换为秒
  • @SanjayRabari 秒数是从什么时候开始的?日期指定时间点,而不是长度(对于长度,我们需要两个点)。我并不是说你的总体想法不好,但你需要更具体:)
  • @Pshemo 你是对的..我认为他必须为此提供实例
  • 一个月算多少天?
  • 这似乎是不可能的。一个月有多少天? 28、30、31?如果您想要一个近似值,我只需拆分字符串并乘以这些值并假设月份有 30 天和一年 365。

标签: java date time calendar duration


【解决方案1】:

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

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

一个半小时将是PT1H30M

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

搜索 StackOverflow 了解更多信息。

【讨论】:

    【解决方案2】:

    Java-8 引入了java.time.Durationjava.time.Period 作为JSR-310 implementation 的一部分,但是对于ISO_8601#Durations 指定的类型组合周期和持续时间的等待时间很长。

    但是,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
    

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多