Convert x hour(s) y min(s) into z minutes using Java

社会主义新天地 提交于 2019-12-13 03:42:56

问题


I have fetched google maps ETAs (that is, durations) for some routes in the format of x hour(s) y min(s), and also if x > 24 then this format changes into u day(s) v hour(s).

Now I want to compare these values to some other ETAs so all I need to do is convert these format value into a minutes-only value.

Such as I have a value as 4 hours 34 mins, I want to change it into minutes using Java or such as 1 hour 1 min to minutes, there are records where hour indicated as 1 hour and 3 hours and same for mins and days.


回答1:


    Duration lessThanADay = Duration.ofHours(4).plusMinutes(34);
    long minutes = lessThanADay.toMinutes();

This yields 274 minutes. The case for more than 24 hours is similar:

    Duration moreThanADay = Duration.ofDays(1).plusHours(3);

This time toMinutes() returns 1620.

You can apply and mix plusHours() and plusMinutes()freely depending on which input numbers you’ve got.

EDIT: Your input strings are a bit more complicated. The Duration class can parse strings in ISO 8601 format, it goes like PT3H23M for a period of time of 3 hours 23 minutes. It may feel a little odd at first. However, we can fix your strings into this format:

private static Duration toDuration(String durationString) {
    durationString = durationString.replaceAll(" days?", "D");
    durationString = durationString.replaceAll(" hours?", "H");
    durationString = durationString.replaceAll(" mins?", "M");
    durationString = durationString.replace(" ", "");
    if (durationString.contains("D")) {
        durationString = durationString.replaceFirst("\\d+D", "P$0T");
    } else {
        durationString = "PT" + durationString;
    }
    return Duration.parse(durationString);
}

Let’s try this method on your example strings from the comment:

    System.out.println(toDuration("3 hours 23 mins"));
    System.out.println(toDuration("2 hours 56 mins"));
    System.out.println(toDuration("1 hour 1 min"));
    System.out.println(toDuration("1 day 18 hours"));

This prints:

PT3H23M
PT2H56M
PT1H1M
PT42H

So all of your strings have been recognized and parsed.

For the comparison, you don’t need to convert to minutes since Duration objects have a natural ordering and can be compared using compareTo, for example:

    if (lessThanADay.compareTo(moreThanADay) < 0) {
        System.out.println("Less");
    }

(This prints Less.) You may find it more natural to compare the long minutes values using < and >, though.




回答2:


You could split it on space...

String s[]="3 hours 23 mins".split(" ")

Then I'd just normalize everything to minutes

int minutes=0;
for(int i=0;i<=2;i+=2) {
   if(s[i+1].startsWith("min"))
       minutes+=s[i]
   if(s[i+1].startsWith("hour"))
       minutes+=s[i]*60
   if(s[i+1].startsWith("day"))    
       minutes+=s[i]*60*24
}

If you were to put the lookup values into a map you could cut 2/3 from that loop, I'd do it that way in Groovy where the additional syntax would be minimal but in java it's a 50/50 if the added awkwardness loweres the redundancy enough to be worth it.



来源:https://stackoverflow.com/questions/48771876/convert-x-hours-y-mins-into-z-minutes-using-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!