Java format hour and min
Asked Answered
A

4

5

I need to format my time string such as this:

int time = 160;

Here's my sample code:

public static String formatDuration(String minute) {
    String formattedMinute = null;
    SimpleDateFormat sdf = new SimpleDateFormat("mm");
    try {
        Date dt = sdf.parse(minute);
        sdf = new SimpleDateFormat("HH mm");
        formattedMinute = sdf.format(dt);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return formattedMinute;
//        int minutes = 120;
//        int h = minutes / 60 + Integer.parseInt(minute);
//        int m = minutes % 60 + Integer.parseInt(minute);
//        return h + "hr " + m + "mins";
}

I need to display it as 2hrs 40mins. But I don't have a clue how to append the "hrs" and "mins". The requirement is not to use any library.

If you've done something like this in the past, feel free to help out. Thanks a bunch!

Antigen answered 18/5, 2018 at 20:57 Comment(5)
What is time representing? What units is it in? Mayan Long Count units?Pizarro
You might find it helpful to learn about generating and parsing standard ISO 8601 strings for durations using the java.time.Duration class.Tanberg
FYI, the troublesome old date-time classes such as java.util.Date, java.util.Calendar, and java.text.SimpleDateFormat are now legacy, supplanted by the java.time classes built into Java 8 and later. See Tutorial by Oracle.Tanberg
@Pizarro minutes broAntigen
Possible duplicate of How to convert Milliseconds to “X mins, x seconds” in Java? There are many other similar questions and answers, please use your search engine.Holst
S
9

Since, it's 2018, you really should be making use of the Date/Time libraries introduced in Java 8

String minutes = "160";
Duration duration = Duration.ofMinutes(Long.parseLong(minutes));

long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();

// Or if you're lucky enough to be using Java 9+
//String formatted = String.format("%dhrs %02dmins", duration.toHours(), duration.toMinutesPart());
String formatted = String.format("%dhrs %02dmins", hours, mins);
System.out.println(formatted);

Which outputs...

2hrs 40mins

Why use something like this? Apart of generally been a better API, what happens when minutes equals something like 1600?

Instead of printing 2hrs 40mins, the above will display 26hrs 40mins. SimpleDateFormat formats date/time values, it doesn't deal with duration

Sosthina answered 18/5, 2018 at 21:35 Comment(5)
thanks for this! But the requirement is not to use any library. I will use this sample you provided in my production apps instead.Antigen
@bEtTyBarnes What library? How is using this any different from using SimpleDateFormat? It's part of the core APISosthina
@bEtTyBarnes Please explain that requirement more precisely in your question. It seems to be an important restriction. How about the built-in standard libraries in Java?Holst
If i18n is important I recommend using a Locale-aware formatter such as DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault())Outwards
@Outwards Agreed, that wold by one of the more important reasons for using a formatter - but I'm not aware if DateFormat supports formatting duration (because, what's 28hrs anyway?)Sosthina
T
2
int minutes = 160;

int h = minutes / 60;
int m = minutes % 60;

String.format("%d hr %d mins",h,m); // output : 2 hr 40 mins
Trinity answered 3/1, 2020 at 5:35 Comment(0)
S
-1

Just try

sdf = new SimpleDateFormat("HH 'hrs' mm 'mins'");

There is a good documentation https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html From the doc:

"Text can be quoted using single quotes (') to avoid interpretation."

Snoopy answered 18/5, 2018 at 21:1 Comment(2)
Oh! I didn't know it is possible to put some single quotes in it.Antigen
What happens when the input becomes "1600"? This approach will break downSosthina
M
-1

Another simple approach could be something along the lines:

public static String formatDuration(String minute){
    int minutes = Integer.parseInt(minute);

    int hours = minutes / 60;
    minutes = minutes % 60;

    return hours + "hrs " + minutes + "mins.";
}
Malignity answered 18/5, 2018 at 21:5 Comment(1)
Rolling your own date-time code is generally poor advice. We have the excellent java.time classes available; use them. See the correct Answer by MadProgrammer.Tanberg

© 2022 - 2024 — McMap. All rights reserved.