Интервальное время вычитания в Java - PullRequest
5 голосов
/ 14 июня 2011

Я пытался найти разницу во времени (ЧЧ: мм: сс.ССС) в Java, где каждый раз может быть больше 24 часов. SimpleDateFormat не поддерживает время больше 24 часов.

Например,

Время А = 36: 00: 00
Время B = 23: 00: 00.00

Я бы хотел получить ответ 13: 00: 00.00. (13 часов).

Кто-нибудь знает, существуют ли какие-либо библиотеки Java, которые могут выполнять вычитание? Также хотелось бы знать, возможно ли добавление времени с библиотекой Java.

Ответы [ 5 ]

11 голосов
/ 14 июня 2011

Вам не нужна сторонняя библиотека

Это простая математика, которая напрямую не имеет ничего общего с Date DateTime или 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 цифры.

3 голосов
/ 14 июня 2011

Вот полное решение с использованием JodaTime.Осмелюсь сказать, что не существует сравнительно простого и элегантного способа сделать это, используя java.util или java.util.concurrent apis:

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();
}

(LenientChronology гарантирует, что значения, такие как 38:00: Поддерживаются 00.00)

1 голос
/ 14 июня 2011

Взгляните на Joda-Time , которая является полной библиотекой для работы со временем и датой в Java, включая арифметику на интервалах.

0 голосов
/ 14 июня 2011

Вот пример того, как получить разницу между двумя датами, используя 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());
  }
0 голосов
/ 14 июня 2011

Попробуйте преобразовать время в секунды, вычтите и затем конвертируйте обратно в простой формат времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...