Java: convert seconds into day, hour, minute and seconds using TimeUnit

JavaDatetimeTime

Java Problem Overview


I am using TimeStamp class to convert seconds into Day,Hours,Minutes,Seconds. I used following code

public static void calculateTime(long seconds) {
		int day = (int)TimeUnit.SECONDS.toDays(seconds);		
		long hours = TimeUnit.SECONDS.toHours(seconds) - TimeUnit.SECONDS.toHours(TimeUnit.SECONDS.toDays(seconds));
		long minute = TimeUnit.SECONDS.toMinutes(seconds) - TimeUnit.SECONDS.toMinutes(TimeUnit.SECONDS.toHours(seconds));
		long second = TimeUnit.SECONDS.toSeconds(seconds) - TimeUnit.SECONDS.toSeconds(TimeUnit.SECONDS.toMinutes(seconds));
		
		System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
		
	}

But I am not getting right result. For example when I called this method as calculateTime(3600) it gives me the result as Day 0 Hour 1 Minute 60 Seconds 3540 instead of Day 0 Hour 1 Minute 0 Seconds 0.

What is the wrong with my logic? Please help me.

Java Solutions


Solution 1 - Java

It should be like

 int day = (int)TimeUnit.SECONDS.toDays(seconds);        
 long hours = TimeUnit.SECONDS.toHours(seconds) - (day *24);
 long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds)* 60);
 long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) *60);

EDIT Explanation:

  1. Day calculation is correct, it does not require explanation.
  2. TimeUnit.SECONDS.toHours(seconds) will give you direct conversion from seconds to hours without consideration for days you have already calculated. Minus the hours for days you already got i.e, day*24. You now got remaining hours.
  3. Same for minute and second. You need to minus the already got hour and minutes respectively.

Solution 2 - Java

You can do like this to only use TimeUnit:

public static void calculateTime(long seconds) {
    int day = (int) TimeUnit.SECONDS.toDays(seconds);
    long hours = TimeUnit.SECONDS.toHours(seconds) -
                 TimeUnit.DAYS.toHours(day);
    long minute = TimeUnit.SECONDS.toMinutes(seconds) - 
                  TimeUnit.DAYS.toMinutes(day) -
                  TimeUnit.HOURS.toMinutes(hours);
    long second = TimeUnit.SECONDS.toSeconds(seconds) -
                  TimeUnit.DAYS.toSeconds(day) -
                  TimeUnit.HOURS.toSeconds(hours) - 
                  TimeUnit.MINUTES.toSeconds(minute);
    System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}

or the slightly shorter but maybe not as intuitive

public static void calculateTime(long seconds) {
    int day = (int) TimeUnit.SECONDS.toDays(seconds);
    long hours = TimeUnit.SECONDS.toHours(seconds) -
                 TimeUnit.DAYS.toHours(day);
    long minute = TimeUnit.SECONDS.toMinutes(seconds) -
                  TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(seconds));
    long second = TimeUnit.SECONDS.toSeconds(seconds) -
                  TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(seconds));
    System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}

Solution 3 - Java

Simple method:

public static void calculateTime(long seconds) {
    long sec = seconds % 60;
    long minutes = seconds % 3600 / 60;
    long hours = seconds % 86400 / 3600;
    long days = seconds / 86400;

    System.out.println("Day " + days + " Hour " + hours + " Minute " + minutes + " Seconds " + sec);
}

Solution 4 - Java

Here is a code i created : (For 3600 seconds it shows "Days:0 Hours:1 Minutes:0 Seconds:0")

public class TimeConvert 
{
    public static void main(String[] args) 
    {
        int fsec,d,h,m,s,temp=0,i;
        fsec=3600;
        //For Days
        if(fsec>=86400)
        {
            temp=fsec/86400;
            d=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=86400;
            }
        }
        else
        {
            d=0;
        }
        //For Hours
        if(fsec>=3600)
        {
            temp=fsec/3600;
            h=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=3600;
            }            
        }
        else
        {
            h=0;
        }
        //For Minutes
        if(fsec>=60)
        {
            temp=fsec/60;
            m=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=60;
            }            
        }
        else
        {
            m=0;
        }
        //For Seconds
        if(fsec>=1)
        {
            s=fsec;            
        }
        else
        {
            s=0;
        }
        System.out.println("Days:"+d+" Hours:"+h+" Minutes:"+m+" Seconds:"+s);
    }
}

Hope it answers your question.

Solution 5 - Java

Late but helpful

> get time in the format 00:00:00

/**
     * The time in format.
     *
     * in The Format of 00:00:00
     */

public String getTimeInFormat(long _SECONDS)
{
    if(TimeUnit.SECONDS.toHours(_SECONDS)>0)
    {
        return  String.format("%02d:%02d:%02d",
                TimeUnit.SECONDS.toHours(_SECONDS),
                TimeUnit.SECONDS.toMinutes(_SECONDS) -
                        TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(_SECONDS)),
                TimeUnit.SECONDS.toSeconds(_SECONDS) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(_SECONDS)));
    }
    else {
        return  String.format("%02d:%02d",
                TimeUnit.SECONDS.toMinutes(_SECONDS) -
                        TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(_SECONDS)),
                TimeUnit.SECONDS.toSeconds(_SECONDS) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(_SECONDS)));
    }

}

Solution 6 - Java

Try this

public static void calculateTime(long seconds) {
	
int day = (int)TimeUnit.SECONDS.toDays(seconds);        
long hours = TimeUnit.SECONDS.toHours(seconds) ;

long tempSec = seconds - (TimeUnit.HOURS.toSeconds(hours) );
System.out.println("after hours calculation "+ tempSec);

long minute = TimeUnit.SECONDS.toMinutes(tempSec); 

if(tempSec > TimeUnit.MINUTES.toSeconds(minute)){
	tempSec = tempSec - (TimeUnit.MINUTES.toSeconds(minute) );        	
}else{
	tempSec = TimeUnit.MINUTES.toSeconds(minute) - tempSec;
}
System.out.println("after min calculation "+ tempSec);


long second = TimeUnit.SECONDS.toSeconds(tempSec) ;

System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}

Solution 7 - Java

This is my code:

public static String secondsToString(TimeUnit greatestUnit, long sourceDuration, TimeUnit sourceUnit) {

	int ordinal = greatestUnit.ordinal();
	if(ordinal<=sourceUnit.ordinal())
		return String.format("%02d", sourceDuration);

	final long greatestDuration = greatestUnit.convert(sourceDuration, sourceUnit);
	final long rest = sourceDuration - sourceUnit.convert(greatestDuration, greatestUnit);

	return String.format("%02d:", greatestDuration) + secondsToString(TimeUnit.values()[--ordinal], rest, sourceUnit);
}

or by loop

public static String secondsToStringByLoop(TimeUnit greatestUnit, long sourceDuration, TimeUnit sourceUnit) {

	final StringBuffer sb = new StringBuffer();
	int ordinal = greatestUnit.ordinal();

	while(true){
		if(ordinal<=sourceUnit.ordinal()) {
			sb.append(String.format("%02d", sourceDuration));
			break;
		}

		final long greatestDuration = greatestUnit.convert(sourceDuration, sourceUnit);
// 			if(greatestDuration>0 || sb.length()>0)
		sb.append(String.format("%02d:", greatestDuration));

		sourceDuration -= sourceUnit.convert(greatestDuration, greatestUnit);
		greatestUnit = TimeUnit.values()[--ordinal];
	};

	return sb.toString();
}

usage example:

String str = secondsToString(TimeUnit.DAYS, 1000, TimeUnit.SECONDS);

function returns: "00:00:16:40" (days:hours:minutes:seconds)

str = UnitsConverter.secondsToString(TimeUnit.DAYS, 1000, TimeUnit.MINUTES);

returns: "00:16:40" (days:hours:minutes)

str = UnitsConverter.secondsToString(TimeUnit.MINUTES, 1000, TimeUnit.SECONDS);

returns: "16:40" (minutes:seconds)

Solution 8 - Java

public static void timeCalculator(){
	
	
	  Scanner input = new Scanner(System.in);
      System.out.print("Enter length of time in seconds: ");
      int n = input.nextInt();
      int nDay = n/86400;
      int nHours = (n%86400)/3600;
      int nMin = ((n%86400)%3600) /60;
      int nSec =(((n%86400)%3600)%60);
      System.out.println();
      System.out.print("That is "+ nDay+ " day(s),"+nHours+"  hour(s), "+nMin+"  minute(s), and "+nSec+" second(s). ");
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndroid LearnerView Question on Stackoverflow
Solution 1 - JavaSubir Kumar SaoView Answer on Stackoverflow
Solution 2 - JavaKeppilView Answer on Stackoverflow
Solution 3 - JavaDiemonView Answer on Stackoverflow
Solution 4 - JavacodeDEXTERView Answer on Stackoverflow
Solution 5 - JavaAshvin solankiView Answer on Stackoverflow
Solution 6 - JavaSudhakarView Answer on Stackoverflow
Solution 7 - JavaOleksandr PotomkinView Answer on Stackoverflow
Solution 8 - JavaOnomeView Answer on Stackoverflow