dv02
dv02

Reputation: 342

Convert long to remaining time

I'm currently trying to convert a long to a remaining time. I have got a

long remaining = XXXX

The long are the milliseconds to a certain date. For example: 3,600,000 should result in int weeks = 0, days = 0, hours = 1, minutes = 0, seconds = 0 how can I convert this long so that I end up with 5 ints:

int weeks;
int days;
int hours;
int minutes;
int seconds;

Thank you in advance!

DirtyDev

Upvotes: 1

Views: 2993

Answers (3)

Alexandru Severin
Alexandru Severin

Reputation: 6228

First, I suggest defining the number of ms in a second, minute, hour, etc as constants

static final int SECOND = 1000;        // no. of ms in a second
static final int MINUTE = SECOND * 60; // no. of ms in a minute
static final int HOUR = MINUTE * 60;   // no. of ms in an hour
static final int DAY = HOUR * 24;      // no. of ms in a day
static final int WEEK = DAY * 7;       // no. of ms in a week

Then, you can use basic division (/) and modulus (%) operations to find what you need.

long remaining = XXXX;

int weeks   = (int)( remaining / WEEK);
int days    = (int)((remaining % WEEK) / DAY);
int hours   = (int)((remaining % DAY) / HOUR);
int minutes = (int)((remaining % HOUR) / MINUTE);
int seconds = (int)((remaining % MINUTE) / SECOND);

Upvotes: 2

Anonymous
Anonymous

Reputation: 86296

Excuse me, I don’t want to criticize too much, still I gather from the other answers that it’s easy to either write code that is hard to read or code with typos that gives an incorrect result. DirtyDev, I am aware that you may not be allowed to use Duration, but for anyone else:

    long remaining = 3_600_000;

    Duration remainingTime = Duration.ofMillis(remaining);
    long days = remainingTime.toDays();
    remainingTime = remainingTime.minusDays(days);
    long weeks = days / 7;
    days %= 7; // or if you prefer, days = days % 7;
    long hours = remainingTime.toHours();
    remainingTime = remainingTime.minusHours(hours);
    long minutes = remainingTime.toMinutes();
    remainingTime = remainingTime.minusMinutes(minutes);
    long seconds = remainingTime.getSeconds();

    System.out.println("" + weeks + " weeks " + days + " days "
            + hours + " hours " + minutes + " minutes " + seconds + " seconds");

This prints:

0 weeks 0 days 1 hours 0 minutes 0 seconds

It’s not perfect, but I believe it’s both readable, correct and robust. Duration was meant for times from hours down to nanoseconds, so we still have to do the weeks “by hand”.

Happy New Year.

Upvotes: 2

user1097772
user1097772

Reputation: 3549

This should do what you want.

    long inputTimeInMilliseconds = 93800000;
    long milliseconds = inputTimeInMilliseconds % 1000;
    long seconds =  (inputTimeInMilliseconds / 1000) % 60 ;
    long minutes =  ((inputTimeInMilliseconds / (1000*60)) % 60);
    long hours   =  ((inputTimeInMilliseconds / (1000*60*60)) % 24);
    long days =  ((inputTimeInMilliseconds / (1000*60*60*24)) % 7);
    long weeks = (inputTimeInMilliseconds / (1000*60*60*24*7));

    String remainingTime = "time:"+weeks+":"+days+":"+ hours+":"+minutes+":"+seconds+":"+milliseconds;
    System.out.println(remainingTime);

Upvotes: 1

Related Questions