Период и продължителност в Java

1. Общ преглед

В този бърз урок ще разгледаме два нови класа за работа с дати, въведени в Java 8: Период и Продължителност .

И двата класа могат да се използват за представяне на време или за определяне на разликата между две дати. Основната разлика между двата класа е, че Period използва базирани на дата стойности, докато Duration използва базирани на времето стойности.

2. Период Клас

Класът Период използва мерните единици година, месец и ден, за да представи период от време.

Можем да получим Period обект като разлика между две дати, като използваме метода between () :

LocalDate startDate = LocalDate.of(2015, 2, 20); LocalDate endDate = LocalDate.of(2017, 1, 15); Period period = Period.between(startDate, endDate);

След това можем да определим датните единици за периода, като използваме методите getYears (), getMonths (), getDays () :

LOG.info("Years:" + period.getYears() + " months:" + period.getMonths() + " days:"+period.getDays());

В този случай методът isNegative () , който връща true, ако някоя от единиците е отрицателна, може да се използва, за да се определи дали endDate е по-висок от startDate :

assertFalse(period.isNegative());

Ако isNegative () връща false, тогава startDate е по-рано от стойността на endDate .

Друг начин за създаване на обект Период се основава на броя дни, месеци, седмици или години, използвайки специални методи:

Period fromUnits = Period.of(3, 10, 10); Period fromDays = Period.ofDays(50); Period fromMonths = Period.ofMonths(5); Period fromYears = Period.ofYears(10); Period fromWeeks = Period.ofWeeks(40); assertEquals(280, fromWeeks.getDays());

Ако присъства само една от стойностите, например с помощта на метода ofDays () , тогава стойността на останалите единици е 0.

В случая на метода ofWeeks () стойността на параметъра се използва за задаване на броя дни, като се умножи по 7.

Също така можем да създадем Period обект, като анализираме текстова последователност , която трябва да има формат „PnYnMnD“:

Period fromCharYears = Period.parse("P2Y"); assertEquals(2, fromCharYears.getYears()); Period fromCharUnits = Period.parse("P2Y3M5D"); assertEquals(5, fromCharUnits.getDays());

Стойността на периода може да бъде увеличена или намалена чрез използване на методи от формата plusX () и minusX () , където X представлява датата:

assertEquals(56, period.plusDays(50).getDays()); assertEquals(9, period.minusMonths(2).getMonths());

3. Клас за продължителност

Класът на продължителност представлява интервал от време в секунди или наносекунди и е най-подходящ за обработка на по-кратки периоди от време, в случаи, които изискват по-голяма точност.

Можем да определим разликата между два момента като обект на продължителност, като използваме метода between () :

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); Duration duration = Duration.between(start, end);

Тогава можем да използваме методите getSeconds () или getNanoseconds () , за да определим стойността на времевите единици:

assertEquals(60, duration.getSeconds());

Като алтернатива можем да получим екземпляр Duration от два екземпляра LocalDateTime:

LocalTime start = LocalTime.of(1, 20, 25, 1024); LocalTime end = LocalTime.of(3, 22, 27, 1544); Duration.between(start, end).getSeconds();

Методът isNegative () може да се използва, за да се провери дали крайният момент е по-висок от началния момент:

assertFalse(duration.isNegative());

Също така можем да получим обект Duration, базиран на няколко единици време , като използваме методите наDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () :

Duration fromDays = Duration.ofDays(1); assertEquals(86400, fromDays.getSeconds()); Duration fromMinutes = Duration.ofMinutes(60);

За да създадете обект Duration, базиран на текстова последователност, това трябва да бъде във формата „PnDTnHnMn.nS“:

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); Duration fromChar2 = Duration.parse("PT10M");

Продължителността може да бъде преобразувана в други времеви единици с помощта на toDays (), toHours (), toMillis (), toMinutes () :

assertEquals(1, fromMinutes.toHours());

Стойността на продължителността може да бъде увеличена или намалена чрез използване на методи от формата plusX () или minusX () , където X може да стои дни, часове, мили, минути, нано или секунди:

assertEquals(120, duration.plusSeconds(60).getSeconds()); assertEquals(30, duration.minusSeconds(30).getSeconds());

Също така можем да използваме методите plus () и minus () с параметър, който указва TemporalUnit за добавяне или изваждане:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds()); assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Заключение

В този урок показахме как можем да използваме класовете Period и Duration .

Както винаги, пълният изходен код на примерите може да бъде намерен в GitHub.