Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

minus 1 hour to DateTime using Joda Time

I just want to subtract 1 hour from a DateTime I tried looking it up on Google and I found that there is a method called minus that takes a copy of the date and take a specific duration right here: http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minus(long)

But I don't know how to use it and I can't an find a example on the internet.

Here's my code:

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

Sample Data:

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

the period will be 9 hours. but i want it to be 8 hrs only because i want to subtract the lunch break in my program.

i tried it with this stupid code:

dateTime1.minus(-1) 

I also tried parsing string1 to double so I can subtract it by one.

double strindtoD = Integer.parseInt(string1);

I also tried making another DateTime and use period to get the difference of the two time

String stringOneHour = ("01:00 AM");
DateTime dateTime3 = dtf.parseDateTime(stringOneHour.toString());
Period timePeriod = new Period(dateTime3, dateTime1);
like image 906
Maguzu Avatar asked Jun 08 '13 14:06

Maguzu


1 Answers

Just use:

dateTime.minusHours(1)

This is documented in the API.

Note that DateTime objects are immutable, so the operation alone has no effect. You need to assign the result of this method to a new object (or replace itself):

dateTime = dateTime.minusHours(1);

As to how to obtain a Period out of the difference between two DateTimes, you must first go through an Interval:

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

Link to a SO post explaining why there is both Period and Interval.

Side note: Joda Time uses a LOT of indirections in its API; as such reading the Javadoc not only requires one to read the methods for one class, but also look at the list of inherited methods from all the inherited abstract classes/interfaces; for instance, a DateTime is also a ReadableInstant. One you get used to it, though, it's a breeze.

like image 102
fge Avatar answered Oct 28 '22 07:10

fge