Минус 1 час до DateTime с использованием Joda Time

Я просто хочу вычесть 1 час из DateTime, я попытался найти его в Google, и я обнаружил, что есть метод, называемый минусом, который берет копию даты и занимает определенную продолжительность прямо здесь: http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minus(long)

Но я не знаю, как его использовать, и я не могу найти пример в Интернете.

Здесь мой код:

String string1 = (String) table_4.getValueAt(0, 1);
    String string2= (String) table_4.getValueAt(0, 2);

    DateTimeFormatter dtf = DateTimeFormat.forPattern("hh:mm a").withLocale(Locale.ENGLISH);
    DateTime dateTime1 = dtf.parseDateTime(string1.toString());
    DateTime dateTime2 = dtf.parseDateTime(string2.toString());

    final String oldf = ("hh:mm a");
    final String newf= ("hh.mm 0");
    final String newf2= ("hh.mm a");
    final String elapsedformat = ("hh.mm");

    SimpleDateFormat format2 = new SimpleDateFormat(oldf);
    SimpleDateFormat format2E = new SimpleDateFormat(newf); 

    Period timePeriod = new Period(dateTime1, dateTime2);

    PeriodFormatter formatter = new PeriodFormatterBuilder()

     .appendHours().appendSuffix(".")
     .appendMinutes().appendSuffix("")
     .toFormatter();

    String elapsed = formatter.print(timePeriod);

    table_4.setValueAt(elapsed,0,3);

    DecimalFormat df = new DecimalFormat("00.00");
    System.out.println(dateTime1);
    table_4.setValueAt("", 0, 4);
    table_4.setValueAt("", 0, 5);

Пример данных:

    dateTime1: 08:00 AM
    dateTime2: 05:00 PM

период составит 9 часов. но я хочу, чтобы это было 8 часов только потому, что я хочу вычесть перерыв на обед в моей программе.

Я попробовал это с этим глупым кодом:

dateTime1.minus(-1) 

Я также попытался разобрать string1, чтобы я мог вычесть его на единицу.

double strindtoD = Integer.parseInt(string1);

Я также попытался сделать еще один DateTime и использовать период, чтобы получить разницу между двумя моментами

String stringOneHour = ("01:00 AM");
DateTime dateTime3 = dtf.parseDateTime(stringOneHour.toString());
Period timePeriod = new Period(dateTime3, dateTime1);

Ответ 1

Просто используйте:

dateTime.minusHours(1)

Это задокументировано в API.

Обратите внимание, что объекты DateTime неизменяемы, поэтому сама операция не имеет эффекта. Вам нужно присвоить результат этого метода новому объекту (или заменить его):

dateTime = dateTime.minusHours(1);

Что касается того, как получить Period вне разницы между двумя DateTime s, вы должны сначала пройти через Interval:

Period period = new Interval(begin, end).toPeriod();

Ссылка на сообщение SO, объясняющее, почему существуют Period и Interval.

Боковое примечание: Joda Time использует LOT-направления в своем API; как таковое чтение Javadoc требует не только чтения методов для одного класса, но и просмотра списка унаследованных методов из всех унаследованных абстрактных классов/интерфейсов; например, a DateTime также является ReadableInstant. Один из них вы привыкнете к этому, хотя это легкий ветерок.

Ответ 2

Если вы используете более старую версию org.joda.time.DateTime, вы можете использовать метод минус (ReadablePeriod period), подобный этому

        Date date = LocalDate.now().minus(new Period(1, 0, 0, 0)).toDate();

где Период принимает int hours, int minutes, int seconds, int millis parameters

Ответ 3

Используя объект класса Calender, вы можете использовать этот метод для вычитания часов.

cal.add(Calendar.HOUR_OF_DAY, -numberOfHours);

а также полный пример ссылка