Дата и время в Java 8. Продолжительность, класс Duration

июля
11
2014

Содержание

Класс Duration служит для хранения продолжительности времени на основе секунд и наносекунд. Также для отображения длительности можно использовать и другие величины, вроде минут, часов, дней. Однако, основное предназначение этого класса - представление небольших промежутов времени. Для работы с длительными промежутками времени предназначен другой класс - Period.

Обратите внимание, что при вычислении продолжительности не учитывается переход на летнее/зимнее время.

Максимальное значение продолжительности равняется максимальному значению типа Long в секундах. Т.е., 2^63-1 секунд или ~3 * 10^11 лет! Это больше, чем предполагаемый возраст вселенной.

Секунды и наносекунды хранятся отдельно. Как было сказано выше, секунды хранятся в переменной типа long, наносекунды - в переменной типа int. Причем сохраняются только наносекунды от секунды и всегда в пределах от 0 до 999 999 999.

Создание экземпляров класса Duration

Рассмотрим пример создания экземпляров Duration с использованием статических методов:


import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Month;

public class Main {
	public static void main(String[] args) {
		LocalDateTime from = LocalDateTime.of(2014, Month.JULY, 9, 12, 00);
		LocalDateTime to = LocalDateTime.of(2014, Month.JULY, 9, 13, 00);
		
		Duration duration = Duration.between(from, to);
		System.out.println("duration: " + duration.toMinutes());
	}
	
}
// output
// duration: 3600000


Метод Описание
between(Temporal startInclusive, Temporal endExclusive)
from(TemporalAmount amount)
of(long amount, TemporalUnit unit)
ofDays(long days)
ofHours(long hours)
ofMillis(long millis)
ofMinutes(long minutes)
ofNanos(long nanos)
ofSeconds(long seconds)
ofSeconds(long seconds, long nanoAdjustment)
parse(CharSequence text)

Рассмотрим подробнее метод parse. Этот метод преобразовует текстовое представление продолжительности вида PnDTnHnMn.nS в объект Duration. Строка начинается с опционального символа '+' или '-'. Затем следует символ 'P' в нижнем или верхнем регистре. Далее могут быть 4 секции, каждая из которых содержит число и суффикс. Суффиксами могут быть следующие символы 'D', 'H', 'M' и 'S' для дней, часов, минут и секунд соответственно. При этом не важно в нижнем или верхнем регистре. Символ 'T' (time, время) должен быть перед первым появлением секции часов, минут или секунд (символы 'H', 'M' и 'S'). После символа 'T' должна быть минимум одна секция. Например:


import java.time.Duration;

public class Main {
	public static void main(String[] args) {
	    System.out.println("1: " + Duration.parse( "+PT20.345S" ));
	    System.out.println("2: " + Duration.parse( "PT20.345S" ));
	    System.out.println("3: " + Duration.parse( "PT15M" ));
	    System.out.println("4: " + Duration.parse( "PT10H" ));
	    System.out.println("5: " + Duration.parse( "P2D" ));
	    System.out.println("6: " + Duration.parse( "P2DT3H4M" ));
	    System.out.println("7: " + Duration.parse( "PT-6H3M" ));
	    System.out.println("8: " + Duration.parse( "-PT6H3M" ));
	    System.out.println("9: " + Duration.parse( "-PT-6H+3M" ));
	    System.out.println("9: " + Duration.parse( "P-2DT-6H3M" ));
	}
}

// output
// 1: PT20.345S
// 2: PT20.345S
// 3: PT15M
// 4: PT10H
// 5: PT48H
// 6: PT51H4M
// 7: PT-5H-57M
// 8: PT-6H-3M
// 9: PT5H57M
// 9: PT-53H-57M

Как видно из примера, продолжительность также может быть негативной. Для преобразования даты к позитивному виду используйте метод abs(), для проверки или дата является негативной - метод isNegative(), а для преобразования даты к негативному виду - метод negated():


import java.time.Duration;

public class Main {
	public static void main(String[] args) {
	    Duration minusTwoDays = Duration.ofDays( -2 );
		System.out.println("minusTwoDays: " + minusTwoDays);
		if( minusTwoDays.isNegative() ){
			Duration twoDays = minusTwoDays.abs();
			System.out.println("twoDays: " + twoDays);
			System.out.println("minusTwoDays: " + twoDays.negated());
		}
	}
}

// output:
// minusTwoDays: PT-48H
// twoDays: PT48H
// minusTwoDays: PT-48H

Ниже представлены примеры использования методов of*


import java.time.Duration;

public class Main {
	public static void main(String[] args) {
	    System.out.println("ofDays: " + Duration.ofDays( 2 ));
	    System.out.println("ofHours: " + Duration.ofHours( 4 ));
	    System.out.println("ofMinutes: " + Duration.ofMinutes( 3 ));
	    System.out.println("ofSeconds: " + Duration.ofSeconds( 14 ));
	    System.out.println("ofSeconds2: " + Duration.ofSeconds( 14, 1500050 ));
	    System.out.println("ofMillis: " + Duration.ofMillis( 150 ));
	    System.out.println("ofNanos: " + Duration.ofNanos( 35005 ));
	}
}

// output:
// ofDays: PT48H
// ofHours: PT4H
// ofMinutes: PT3M
// ofSeconds: PT14S
// ofSeconds2: PT14.00150005S
// ofMillis: PT0.15S
// ofNanos: PT0.000035005S

Получение продолжительности в нужном формате

Ниже представлены методы, с помощью которых можно получить значения продолжительности в разных величинах:

Метод Описание
getNano()
getSeconds()
toDays()
toHours()
toMinutes()
toMillis()
toNanos()

Ниже примеры, демонстрирующие все методы:


import java.time.Duration;

public class Main {
	public static void main(String[] args) {
	    Duration twoDays = Duration.ofDays( 2 );
	    System.out.println("toDays: " + twoDays.toDays());
	    System.out.println("toHours: " + twoDays.toHours());
	    System.out.println("toMinutes: " + twoDays.toMinutes());
	    System.out.println("getSeconds: " + twoDays.getSeconds());
	    System.out.println("toMillis: " + twoDays.toMillis());
	    System.out.println("toNanos: " + twoDays.toNanos());
	    System.out.println("getNano: " + twoDays.getNano());
	}
}

// output:
// toDays: 2
// toHours: 48
// toMinutes: 2880
// getSeconds: 172800
// toMillis: 172800000
// toNanos: 172800000000000
// getNano: 0


Изменение продолжительности

Как и в случае с классом LocalDateTime, в классе Duration существуют удобные методы для изменения продолжительности: plus*, minus* и with*:

Метод Описание
minus(Duration duration)
minusDays(long daysToSubtract)
minusHours(long hoursToSubtract)
minusMinutes(long minutesToSubtract)
minusSeconds(long secondsToSubtract)
minusMillis(long millisToSubtract)
minusNanos(long nanosToSubtract)
plus(Duration duration)
plusDays(long daysToAdd)
plusHours(long hoursToAdd)
plusMinutes(long minutesToAdd)
plusSeconds(long secondsToAdd)
plusMillis(long millisToAdd)
plusNanos(long nanosToAdd)
multipliedBy(long multiplicand)
dividedBy(long divisor)
withNanos(int nanoOfSecond)
withSeconds(long seconds)

Эти методы возвращают объект Duration, поэтому можно выполнять последовательность действий. Например:


import java.time.Duration;

public class Main {
	public static void main(String[] args) {
		Duration duration = Duration
				.parse( "P21DT5H15M45.150S" )
				.plusNanos( 150 )
				.plusDays(2)
				.minusMinutes(15)
				.dividedBy(2);
		System.out.println("duration: " + duration);	
	}
}

// output:
// duration: PT278H30M22.575000075S

< Дата и время в Java 8. Сравнение даты и времени

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии