0

I am struggling to calculate time when going after midnight:

String time = "15:00-18:05"; //Calculating OK
    //String time = "22:00-01:05"; //Not calculating properly
    String[] parts = time.split("-");

    SimpleDateFormat format = new SimpleDateFormat("HH:mm");
    Date date1 = null;
    Date date2 = null;
    Date dateMid = null;


    String dateInString = "24:00";
    try {
        dateMid = format.parse(dateInString);
    } catch (ParseException e1) {
        e1.printStackTrace();
    }

    try {
        date1 = format.parse(parts[0]);
        date2 = format.parse(parts[1]);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    long difference = date2.getTime() - date1.getTime();


    if (date2.getTime()<date1.getTime()) //in case beyond midnight calculation
    {
        difference = dateMid.getTime()-difference;
    }



    int minutes = (int) ((difference / (1000*60)) % 60);
    int hours   = (int) ((difference / (1000*60*60)) % 24);

    String tot = String.format("%02d:%02d", hours,minutes);
    System.out.println("dif2: "+tot);
Dim
  • 4,527
  • 15
  • 80
  • 139
  • you could add a check where you verify that date 2 is before date 1. in that case, you can have something along the lines of 24h-(date1-date2) to find out the actual difference between date 1 and date 2 – Claudiu Guja Apr 12 '18 at 08:29
  • What about daylight saving times? 22:00-04:00 might be a difference of five, six or seven hours dependent on the day of the year. – Lothar Apr 12 '18 at 08:39
  • What is the question? – Ole V.V. Apr 12 '18 at 16:25
  • The `Date` class is long outdated, and especially `SimpleDateFormat` is also notoriously troublesome. You may want to forget about those classes and instead use [`java.time`, the modern Java date and time API](https://docs.oracle.com/javase/tutorial/datetime/). It is so much nicer to work with. – Ole V.V. Apr 12 '18 at 16:27

1 Answers1

5

If you don't care about daylight saving changes and you assume the world is ideal (which it isn't), you can just subtract the duration between end and start (treating end as the start and start as the end) from 24 hours:

String time = "22:00-01:05";
String[] parts = time.split("-");

LocalTime start = LocalTime.parse(parts[0]);
LocalTime end = LocalTime.parse(parts[1]);
if (start.isBefore(end)) { // normal case
    System.out.println(Duration.between(start, end));
} else { // 24 - duration between end and start, note how end and start switched places
    System.out.println(Duration.ofHours(24).minus(Duration.between(end, start)));
}
Sweeper
  • 213,210
  • 22
  • 193
  • 313