有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的间隔时间减法

我试图在Java中找到时间上的差异(HH:mm:ss.SSS),在Java中,每个时间可以超过24小时SimpleDateFormat不支持大于24小时的时间

比如说,

时间A=36:00:00.00
时间B=23:00:00.00

我想得到13:00:00.00的答案。(13小时)

有人知道是否有Java库可以执行减法吗。还想知道Java库是否可以添加时间


共 (5) 个答案

  1. # 1 楼答案

    下面是使用JodaTime的完整解决方案。我敢说,使用java.utiljava.util.concurrentAPI没有比这更简单、更优雅的方法:

    public static int getHoursBetween(final String date1, final String date2){
        final DateTimeFormatter fmt =
            DateTimeFormat
                .forPattern("HH:mm:ss.SS")
                .withChronology(
                    LenientChronology.getInstance(
                        GregorianChronology.getInstance()));
        return Hours.hoursBetween(
            fmt.parseDateTime(date1),
            fmt.parseDateTime(date2)
        ).getHours();
    }
    

    ^{}确保支持38:00:00.00等值)

  2. # 2 楼答案

    尝试将时间转换为秒,减去,然后转换回简单的时间格式

  3. # 3 楼答案

    下面是一个如何使用Joda-Time获得两个日期之间差异的示例(这是Jim Garrison之前提到的)。它确实是可用的最佳时间库之一

      public static void main(String[] args) {
        DateTime timeA = new DateTime(2011, 6, 13, 12, 0, 0, 0);
        DateTime timeB = new DateTime(2011, 6, 12, 23, 0, 0, 0);
    
        Period period = new Period(timeB, timeA);
        System.out.println(period.getHours());
      }
    
  4. # 4 楼答案

    您不需要第三方库

    这是一个简单的数学问题,似乎与Date{}或Timestamp实例没有直接关系,但似乎与interval相关,而且JDK中有内置的功能>;=1.5使用java.util.concurrent.TimeUnit只处理这种类型的数学,而不引入任何依赖项

    下面是解析输入并将其转换为毫秒的代码,然后您可以将其转换回所需的任何String格式,我方便地选择了您请求的格式

    java.util.concurrent.TimeUnit是一个隐藏的小宝石,大多数人不知道这种偷偷溜进1.5的情况。这类人被埋在java.util.concurrent包裹里,似乎没有人知道,这是一种犯罪

    import java.util.concurrent.TimeUnit;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main
    {
        private static long parseInterval(final String s)
        {
            final Pattern p = Pattern.compile("^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$");
            final Matcher m = p.matcher(s);
            if (m.matches())
            {
                final long hr = Long.parseLong(m.group(1)) * TimeUnit.HOURS.toMillis(1);
                final long min = Long.parseLong(m.group(2)) * TimeUnit.MINUTES.toMillis(1);
                final long sec = Long.parseLong(m.group(3)) * TimeUnit.SECONDS.toMillis(1);
                final long ms = Long.parseLong(m.group(4));
                return hr + min + sec + ms;
            }
            else
            {
                throw new IllegalArgumentException(s + " is not a supported interval format!");
            }
        }
    
        private static String formatInterval(final long l)
        {
            final long hr = TimeUnit.MILLISECONDS.toHours(l);
            final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr));
            final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
            final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
            return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
        }
    
        public static void main(final String[] args)
        {
            final String s1 = "36:00:00.000";
            final String s2 = "23:00:00.000";
    
            final long i1 = parseInterval(s1);
            final long i2 = parseInterval(s2);
    
            System.out.println(formatInterval(i1 - i2));
        }
    }
    

    输出是

    13:00:00.000
    

    我想你的意思是最后一个数字是milliseconds,它的分辨率应该是3位

  5. # 5 楼答案

    看看Joda-Time,这是一个完整的库,用于在Java中处理时间和日期,包括区间算术