Complete Java Duration class tutorial covering all methods with examples. Learn about time handling in Java.
Last modified: April 16, 2025
The java.time.Duration class represents a time-based amount of time in seconds and nanoseconds. It models a quantity or amount of time in terms of seconds and nanoseconds. Duration is used to measure elapsed time between two instants.
Duration is immutable and thread-safe. It is commonly used for measuring time intervals, adding/subtracting time from temporal objects, and calculating differences between temporal objects. Duration works with machine time rather than calendar-based time.
Duration provides methods to create durations, perform calculations, and convert between units. Key operations include adding to temporal objects, comparing durations, and extracting components. The class handles time in seconds and nanoseconds.
public final class Duration implements TemporalAmount, Comparable<Duration>, Serializable { public static Duration ofDays(long days); public static Duration ofHours(long hours); public static Duration ofMinutes(long minutes); public static Duration ofSeconds(long seconds); public static Duration ofMillis(long millis); public static Duration ofNanos(long nanos); public static Duration between(Temporal startInclusive, Temporal endExclusive); public long getSeconds(); public int getNano(); public Duration plus(Duration duration); public Duration minus(Duration duration); public Duration multipliedBy(long multiplicand); public Duration dividedBy(long divisor); public long toDays(); public long toHours(); public long toMinutes(); public long toMillis(); public long toNanos(); }
The code above shows key methods provided by Duration. These methods allow creating, comparing, and manipulating durations. The class provides precision up to nanoseconds while supporting conversion to various time units.
Duration objects can be created using factory methods for specific time units or by calculating differences between temporal objects. The class supports creating durations from days to nanoseconds.
Main.java
package com.zetcode;
import java.time.Duration; import java.time.Instant; import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
// Create from hours
Duration hours = Duration.ofHours(2);
System.out.println("2 hours: " + hours);
// Create from minutes
Duration minutes = Duration.ofMinutes(30);
System.out.println("30 minutes: " + minutes);
// Create from seconds and nanos
Duration seconds = Duration.ofSeconds(45, 500_000_000);
System.out.println("45.5 seconds: " + seconds);
// Create from between two temporals
Instant start = Instant.now();
Instant end = start.plusSeconds(60);
Duration between = Duration.between(start, end);
System.out.println("Between instants: " + between);
// From LocalTime
Duration timeDiff = Duration.between(
LocalTime.of(9, 0),
LocalTime.of(17, 30)
);
System.out.println("Workday duration: " + timeDiff);
}
}
This example demonstrates different ways to create Duration objects. The output shows durations in ISO-8601 duration format (PTnHnMnS). Note that durations created from between operations are exact differences between temporal objects.
A Duration can be decomposed into its seconds and nanoseconds components or converted to various time units. These methods are useful for interoperability with other APIs or for displaying durations in specific units.
Main.java
package com.zetcode;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
Duration duration = Duration.ofHours(2).plusMinutes(30).plusSeconds(15);
// Get seconds and nanos
long seconds = duration.getSeconds();
int nanos = duration.getNano();
System.out.println("Seconds: " + seconds);
System.out.println("Nanoseconds: " + nanos);
// Convert to various units
System.out.println("To days: " + duration.toDays());
System.out.println("To hours: " + duration.toHours());
System.out.println("To minutes: " + duration.toMinutes());
System.out.println("To milliseconds: " + duration.toMillis());
System.out.println("To nanoseconds: " + duration.toNanos());
}
}
This example shows how to extract components from a Duration. Note that conversion methods like toHours return the total duration in that unit, potentially losing precision. The seconds and nanoseconds together provide full precision.
Duration supports arithmetic operations like addition, subtraction, multiplication, and division. These operations are useful for modifying durations while maintaining precision. All operations return new Duration objects.
Main.java
package com.zetcode;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
Duration duration1 = Duration.ofHours(2);
Duration duration2 = Duration.ofMinutes(30);
// Addition
Duration sum = duration1.plus(duration2);
System.out.println("Sum: " + sum);
// Subtraction
Duration diff = duration1.minus(duration2);
System.out.println("Difference: " + diff);
// Multiplication
Duration multiplied = duration1.multipliedBy(3);
System.out.println("Multiplied by 3: " + multiplied);
// Division
Duration divided = duration1.dividedBy(2);
System.out.println("Divided by 2: " + divided);
// Negation
Duration negated = duration1.negated();
System.out.println("Negated: " + negated);
}
}
This example demonstrates various arithmetic operations with Duration objects. All operations maintain nanosecond precision and handle overflow/underflow automatically. Note that operations return new Duration instances as the class is immutable.
Durations can be compared to determine which is longer or if they are equal. The class provides compareTo, equals, and isZero methods. These comparisons are essential for time-based logic in applications.
Main.java
package com.zetcode;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
Duration shortDur = Duration.ofMinutes(15);
Duration mediumDur = Duration.ofHours(1);
Duration longDur = Duration.ofHours(2);
// Comparison
System.out.println("short < medium: " +
(shortDur.compareTo(mediumDur) < 0));
System.out.println("medium == 1 hour: " +
mediumDur.equals(Duration.ofHours(1)));
System.out.println("long > medium: " +
(longDur.compareTo(mediumDur) > 0));
// Zero check
System.out.println("Is zero: " + Duration.ZERO.isZero());
// Negative duration
Duration negative = Duration.ofHours(-1);
System.out.println("Is negative: " + (negative.getSeconds() < 0));
}
}
This example demonstrates various ways to compare Duration objects. The comparison methods consider both seconds and nanoseconds components. Note that equality requires both components to match exactly, while comparison considers the total duration.
Duration can be added to or subtracted from temporal objects like Instant or LocalDateTime. This is useful for calculating future or past points in time relative to a given temporal object.
Main.java
package com.zetcode;
import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
Duration twoHours = Duration.ofHours(2);
// Add to Instant
Instant future = now.plus(twoHours);
System.out.println("Now plus 2 hours: " + future);
// Subtract from Instant
Instant past = now.minus(twoHours);
System.out.println("Now minus 2 hours: " + past);
// With LocalDateTime
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldtFuture = ldt.plus(twoHours);
System.out.println("LocalDateTime plus 2 hours: " + ldtFuture);
// Convert between time zones
Instant utc = Instant.now();
Instant est = utc.atZone(ZoneId.of("America/New_York")).toInstant();
Duration zoneDiff = Duration.between(utc, est);
System.out.println("UTC to EST difference: " + zoneDiff);
}
}
This example shows how to use Duration with various temporal objects. The operations maintain precision and handle time zone conversions when needed. Note that Duration represents an exact amount of time, unaffected by time zones or daylight saving.
Duration can be converted to and from strings using ISO-8601 format. The toString method produces a string representation, while parse creates a Duration from a string.
Main.java
package com.zetcode;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
// Formatting to string
Duration duration = Duration.ofHours(2).plusMinutes(30).plusSeconds(15);
String durationStr = duration.toString();
System.out.println("Formatted: " + durationStr);
// Parsing from string
Duration parsed = Duration.parse("PT1H30M15S");
System.out.println("Parsed: " + parsed);
System.out.println("Hours in parsed: " + parsed.toHours());
// Edge cases
Duration zero = Duration.parse("PT0S");
System.out.println("Zero duration: " + zero);
Duration large = Duration.parse("P2DT3H4M");
System.out.println("Large duration: " + large);
}
}
This example demonstrates formatting and parsing of Duration objects. The ISO-8601 format uses ‘P’ for period, ‘T’ for time, and letters for units (H=hours, M=minutes, S=seconds). Note that parsing is strict and requires proper format.
Java Duration Class Documentation
In this article, we’ve covered the essential methods and features of the Java Duration class. Understanding these concepts is crucial for accurate time interval handling in modern Java applications.
My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.
List all Java tutorials.