betacode

Руководство Java Period

  1. Period
  2. Static Factory Methods
  3. Other methods
  4. get(TemporalUnit)
  5. getX() *
  6. getUnits()
  7. getChronology()
  8. withX(..) *
  9. plus(TemporalAmount)
  10. plusX(..) *
  11. minus(TemporalAmount)
  12. minusX(..) *
  13. isZero()
  14. isNegative()
  15. multipliedBy(int)
  16. negated()
  17. normalized()
  18. toTotalMonths()
  19. addTo(Temporal)
  20. subtractFrom(Temporal)

1. Period

Класс Period использует единицы измерения года, месяца и дня для представления периода времени. Например "3 года 2 месяца 15 дней". Если вам нужно количество времени, основанное на часах, минутах и секундах, используйте класс Duration.
Значения года, месяца и дня в Period независимы, это означает, что если вы добавите или вычтете несколько дней из Period, это не повлияет на год и месяц. Причина этого заключается в том, что продолжительность месяца и года не фиксирована.
public final class Period implements ChronoPeriod, Serializable
Например: Футболист Cristiano Ronaldo родился 5 февраля 1985 года. 29 сентября 2002 года Ronaldo дебютировал в Primeira Liga, так что ему было 17 лет, 7 месяцев 24 дня в то время.
Period_ronaldo_ex1.java
// 1985-02-05 (Ronaldo's birthday).
LocalDate startInclusiveDate = LocalDate.of(1985, 2, 5);

// 2002-09-29 (First time playing in Primeira Liga ).
LocalDate endExclusiveDate = LocalDate.of(2002, 9, 29);

Period period = Period.between(startInclusiveDate, endExclusiveDate);

System.out.println(period); // P17Y7M24D
System.out.println("Years: " + period.getYears());  // 17
System.out.println("Months: " + period.getMonths()); // 7
System.out.println("Days: " + period.getDays()); // 24

2. Static Factory Methods

Статические заводские методы:
public static final Period ZERO = new Period(0, 0, 0);

public static Period ofYears(int years)  
public static Period ofMonths(int months)
public static Period ofWeeks(int weeks)
public static Period ofDays(int days)  
public static Period of(int years, int months, int days)
public static Period from(TemporalAmount amount)
public static Period parse(CharSequence text)  
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)

3. Other methods

Другие методы:
// -----------------------------------------------------------------
// getX()
// -----------------------------------------------------------------

// Inherited from ChronoPeriod interface
public long get(TemporalUnit unit)

// Inherited from ChronoPeriod interface
public List<TemporalUnit> getUnits()  

// Inherited from ChronoPeriod interface
public IsoChronology getChronology()

public int getYears()  
public int getMonths()  
public int getDays()  

// -----------------------------------------------------------------
// withX()
// -----------------------------------------------------------------

public Period withYears(int years)
public Period withMonths(int months)  
public Period withDays(int days)  

// -----------------------------------------------------------------
// plusX()
// -----------------------------------------------------------------

// Inherited from ChronoPeriod interface
public Period plus(TemporalAmount amountToAdd)

public Period plusYears(long yearsToAdd)  
public Period plusMonths(long monthsToAdd)
public Period plusDays(long daysToAdd)

// -----------------------------------------------------------------
// minusX()
// -----------------------------------------------------------------

// Inherited from ChronoPeriod interface
public Period minus(TemporalAmount amountToSubtract)  

public Period minusYears(long yearsToSubtract)  
public Period minusMonths(long monthsToSubtract)
public Period minusDays(long daysToSubtract)  

// -----------------------------------------------------------------

public long toTotalMonths()  

// -----------------------------------------------------------------
//  Other method inherited from ChronoPeriod interface
// -----------------------------------------------------------------
 
public boolean isZero()   
public boolean isNegative()   
public Period multipliedBy(int scalar)  
public Period negated()   
public Period normalized()  
public Temporal addTo(Temporal temporal)
public Temporal subtractFrom(Temporal temporal)

4. get(TemporalUnit)

Возвращать значение указанной единицы измерения.
// Inherited from ChronoPeriod interface
public long get(TemporalUnit unit) {
Поддерживаются только следующие три стандартные единицы измерения, остальные вызовут исключение UnsupportedTemporalTypeException.
  • ChronoUnit.YEARS
  • ChronoUnit.MONTHS
  • ChronoUnit.DAYS
Например:
Period_get_unit_ex1.java
// 20 years 5 months 115 days.
Period period = Period.of(20, 5, 115);

long years = period.get(ChronoUnit.YEARS); // 20
long months = period.get(ChronoUnit.MONTHS); // 5
long days = period.get(ChronoUnit.DAYS); // 115

System.out.printf("%d years, %d months %d days", years, months, days);

5. getX() *

Метод getDays() возвращает количество дней, представленных в этом Period. Значения дня, месяца и года в Period независимы друг от друга, они не могут быть преобразованы друг в друга, поскольку продолжительность месяца и года не фиксирована.
Методы getMonths(), getYears() также понимаются так как следует из их названий.
public int getYears()  
public int getMonths()  
public int getDays()
Например: 20 июля 1969 года космический корабль Apollo 11 совершил посадку на Луну. Мы можем подсчитать, как давно произошло это событие по сравнению с настоящим временем:
Period_getX_ex1.java
// 1969-07-20
LocalDate apollo11Date = LocalDate.of(1969, 7, 20);

// Now
LocalDate now = LocalDate.now();
System.out.println("Now is " + now);

Period period = Period.between(apollo11Date, now);

System.out.println(period);  
System.out.println("Years: " + period.getYears());   
System.out.println("Months: " + period.getMonths());  
System.out.println("Days: " + period.getDays());
Output:
Now is 2021-06-25
P51Y11M5D
Years: 51
Months: 11
Days: 5
На самом деле, чтобы рассчитать количество лет, месяцев, недель или дней между 2 разными моментами времени, вы также можете использовать класс ChronoUnit. См., например:
ChronoUnit_between_ex1.java
// 1969-07-20
LocalDate apollo11Date = LocalDate.of(1969, 7, 20);

// Now
LocalDate now = LocalDate.now();
System.out.println("Now is " + now);

long years = ChronoUnit.YEARS.between(apollo11Date, now);
long months = ChronoUnit.MONTHS.between(apollo11Date, now);
long weeks = ChronoUnit.WEEKS.between(apollo11Date, now);
long days = ChronoUnit.DAYS.between(apollo11Date, now);

System.out.println("Years: " + years);
System.out.println("Months: " + months);
System.out.println("Weeks: " + weeks);
System.out.println("Days:" + days);
Output:
Now is 2021-06-25
Years: 51
Months: 623
Weeks: 2709
Days:18968

6. getUnits()

Возвращать TemporalUnit, поддерживаемые этим Period. Поддерживаются только следующие 3 стандартных TemporalUnit:
  • ChronoUnit.YEARS
  • ChronoUnit.MONTHS
  • ChronoUnit.DAYS
// Inherited from ChronoPeriod interface
public List<TemporalUnit> getUnits()
Например:
Period_getUnits_ex1.java
Period period = Period.of(2, 8, 0);  
// ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS
List<TemporalUnit> units = period.getUnits();

for(TemporalUnit unit: units)  {
    System.out.println("Unit: " + unit.getClass().getName() + " - " + unit);
}
Output:
Unit: java.time.temporal.ChronoUnit - Years
Unit: java.time.temporal.ChronoUnit - Months
Unit: java.time.temporal.ChronoUnit - Days

7. getChronology()

Возвращать хронологию (chronology) этого Period, которая является календарной системой ISO (IsoChronology.INSTANCE).
// Inherited from ChronoPeriod interface
public IsoChronology getChronology()
Например:
Period_getChronology_ex1.java
Period period = Period.of(20,  5,  10);
IsoChronology isoChronology    = period.getChronology();
System.out.println("IsoChronology: " + isoChronology.getId()); // ISO.
  • Руководство Java IsoChronology

8. withX(..) *

Метод withDays(days) возвращает копию этого Period с количеством дней, замененным указанным количеством дней. Этот метод не влияет на год и месяц.
Методы withYears(years), withMonths(months) также понимаются так, как следует из их названий.
public Period withYears(int years)
public Period withMonths(int months)
public Period withDays(int days)
Например:
Period_withX_ex1.java
Period period = Period.of(20, 3, 15);
period = period.withDays(100);

System.out.println(period);
System.out.println("Years: " + period.getYears()); // 20
System.out.println("Months: " + period.getMonths()); // 3
System.out.println("Days: " + period.getDays()); // 100

9. plus(TemporalAmount)

Возвращать копию этого Period с добавленным количеством времени.
public Period plus(TemporalAmount amountToAdd)
Значения дня, месяца и года независимы друг от друга, нормализация не выполняется. Такие как:
  • "2 years 10 months 110 days" + "3 years 5 months 10 days" --> "5 years 15 months 120 days".
Например:
Period_plus_amount_ex1.java
// 20 years 3 months 15 days.
Period period = Period.of(20, 3, 15);  
System.out.println("period: " + period); // P20Y3M15D

TemporalAmount amount = Period.ofMonths(15); // 15 months

Period period2 = period.plus(amount);
System.out.println("period2: " + period2); // P20Y18M15D (20 years, 18 months, 15 days)

10. plusX(..) *

Метод plusDays(daysToAdd) возвращает копию этого Period с указанным количеством добавленных дней, что не влияет на значения года и месяца.
Методы plusYears(yearsToAdd) и plusMonths(monthsToAdd) также понимаются так, как следует из их названий.
public Period plusYears(long yearsToAdd)  
public Period plusMonths(long monthsToAdd)
public Period plusDays(long daysToAdd)
Например:
Period_plusX_ex1.java
Period period = Period.of(20, 3, 15);  

// period1
Period period1 = period.plusDays(100);  

System.out.println("period1.getYears(): " + period1.getYears()); // 20
System.out.println("period1.getMonths(): " + period1.getMonths()); // 3
System.out.println("period1.getDays(): " + period1.getDays()); // 115
System.out.println(" ------- \n");

// period2
Period period2 = period.plusDays(-100);  

System.out.println("period2.getYears(): " + period2.getYears()); // 20
System.out.println("period2.getMonths(): " + period2.getMonths()); // 3
System.out.println("period2.getDays(): " + period2.getDays()); // -85
System.out.println(" ------- \n");

// period3
Period period3 = period.plusYears(-30);  

System.out.println("period3.getYears(): " + period3.getYears()); // -10
System.out.println("period3.getMonths(): " + period3.getMonths()); // 3
System.out.println("period3.getDays(): " + period3.getDays()); // 15
Output:
period1.getYears(): 20
period1.getMonths(): 3
period1.getDays(): 115
 -------

period2.getYears(): 20
period2.getMonths(): 3
period2.getDays(): -85
 -------

period3.getYears(): -10
period3.getMonths(): 3
period3.getDays(): 15

11. minus(TemporalAmount)

Возвращать копию этого Period с вычитанием указанного количества времени.
public Period minus(TemporalAmount amountToSubtract)
Значения дня, месяца и года независимы друг от друга, нормализация не выполняется. Такие как:
  • "2 years 10 months 110 days" - "3 years 5 months 10 days" --> "-1 years 10 months 90 days".
Например:
Period_minus_amount_ex1.java
// 20 years 3 months 15 days.
Period period = Period.of(20, 3, 15);  
System.out.println("period: " + period); // P20Y3M15D

TemporalAmount amount = Period.ofMonths(5); // 5 months

Period period2 = period.minus(amount);
System.out.println("period2: " + period2); // P20Y-2M15D (20 years, -2 months, 15 days)
  • Руководство Java TemporalAmount

12. minusX(..) *

Метод minusDays(daysToSubtract) возвращает копию этого Period с указанным количеством вычитаемых дней, что не влияет на два других поля, год и месяц.
Методы minusYears(yearsToSubtract) и minusMonths(monthsToSubtract) также интерпретируются аналогично их названиям.
public Period minusYears(long yearsToSubtract)  
public Period minusMonths(long monthsToSubtract)  
public Period minusDays(long daysToSubtract)
Например:
Period_minusX_ex1.java
Period period = Period.of(20, 3, 15);  

// period1
Period period1 = period.minusDays(100);  

System.out.println("period1.getYears(): " + period1.getYears()); // 20
System.out.println("period1.getMonths(): " + period1.getMonths()); // 3
System.out.println("period1.getDays(): " + period1.getDays()); // -85
System.out.println(" ------- \n");

// period2
Period period2 = period.minusDays(-100);  

System.out.println("period2.getYears(): " + period2.getYears()); // 20
System.out.println("period2.getMonths(): " + period2.getMonths()); // 3
System.out.println("period2.getDays(): " + period2.getDays()); // 115
System.out.println(" ------- \n");

// period3
Period period3 = period.minusYears(30);  

System.out.println("period3.getYears(): " + period3.getYears()); // -10
System.out.println("period3.getMonths(): " + period3.getMonths()); // 3
System.out.println("period3.getDays(): " + period3.getDays()); // 15
Output:
period1.getYears(): 20
period1.getMonths(): 3
period1.getDays(): -85
 -------

period2.getYears(): 20
period2.getMonths(): 3
period2.getDays(): 115
 -------

period3.getYears(): -10
period3.getMonths(): 3
period3.getDays(): 15

13. isZero()

Возвращать значение true, если все 3 значения дня, месяца и года в этом Period равны 0, в противном случае верните значение false.
// Inherited from ChronoPeriod interface
public boolean isZero()
Например:
Period_isZero_ex1.java
Period period1 = Period.of(0, -1, 30);
System.out.println("period1.isZero()? " + period1.isZero()); // false

Period period2 = Period.of(-1, 12, 0);
System.out.println("period2.isZero()? " + period2.isZero()); // false

Period period3 = Period.of(0, 0, 0);
System.out.println("period3.isZero()? " + period3.isZero()); // true

14. isNegative()

Возвращает значение true, если какой-либо день, месяц или год этого Period отрицательный, в противном случае возвращает значение false.
// Inherited from ChronoPeriod interface
public boolean isNegative()
Например:
Period_isNegative_ex1.java
Period period1 = Period.of(10, -1, 30);
System.out.println("period1.isNegative()? " + period1.isNegative()); // true

Period period2 = Period.of(1, -12, -15);
System.out.println("period2.isNegative()? " + period2.isNegative()); // true

Period period3 = Period.of(0, 0, 0);
System.out.println("period3.isNegative()? " + period3.isNegative()); // false  

Period period4 = Period.of(5, 10, 15);
System.out.println("period4.isNegative()? " + period4.isNegative()); // false

15. multipliedBy(int)

Умножьте этот Period на указанное значение и возвращайте новый Period.
// Inherited from ChronoPeriod interface
public Period multipliedBy(int scalar)
Значения дня, месяца и года независимы друг от друга, нормализация не выполняется.
Например:
Period_multipliedBy_ex1.java
// 20 years 10 months 35 days.
Period period = Period.of(20, 10, 35);

Period result = period.multipliedBy(2);

long years = result.get(ChronoUnit.YEARS); // 40
long months = result.get(ChronoUnit.MONTHS); // 20
long days = result.get(ChronoUnit.DAYS); // 70

System.out.printf("%d years, %d months %d days", years, months, days);

16. negated()

// Inherited from ChronoPeriod interface
public Period negated()
Например:
Period_negated_ex1.java
// 20 years 3 months 15 days.
Period period = Period.of(20, 3, 15);  
System.out.println("period: " + period); // P20Y3M15D

// period2 = 0 - period1
Period period2 = period.negated();
System.out.println("period2: " + period2); // P-20Y-3M-15D (-20 Years, -3 months, -15 days)

17. normalized()

Возвращать копию этого Period с нормализованными годом и месяцем. Год считается равным 12 месяцам, после нормализации значение месяца будет находиться в диапазоне от -11 до 11.
// Inherited from ChronoPeriod interface
public Period normalized()
Например:
  • "1 years -25 months 50 days" --> "-1 year -1 months 50 days".
Period_normalized_ex1.java
// 1 years -25 months 50 days.
Period period = Period.of(1, -25, 50);

Period result = period.normalized();

long years = result.get(ChronoUnit.YEARS); // -1
long months = result.get(ChronoUnit.MONTHS); // -1
long days = result.get(ChronoUnit.DAYS); // 50

System.out.printf("%d years, %d months %d days", years, months, days);

18. toTotalMonths()

Возвращать общее количество месяцев за этот Period, умножив количество лет на 12 и добавив количество месяцев. Количество дней будет проигнорировано.
public long toTotalMonths()
Например:
Period_toTotalMonths_ex1.java
// 1 years 3 months 145 days.
Period period = Period.of(1, 3, 145);  
System.out.println("period: " + period); // P1Y3M145D

long months = period.toTotalMonths();
System.out.println("period.toTotalMonths(): " + months); // 15

19. addTo(Temporal)

No ADS
Добавьте этот период к указанному объекту Temporal и возвращайте новый объект Temporal.
// Inherited from ChronoPeriod interface
public Temporal addTo(Temporal temporal)
Этот метод эквивалентен использованию метода Temporal.plus(TemporalAmount).
// Defined in Temporal interface.
public Temporal plus​(TemporalAmount amount)
Например:
Period_addTo_ex1.java
// Create Temporal object.
LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 10, 23, 30, 0);
System.out.println("localDateTime: " + localDateTime); // 2000-01-10T23:30

// 1 Year 1 month 25 days.
Period period = Period.of(1, 1, 25);

LocalDateTime newLocalDateTime = (LocalDateTime) period.addTo(localDateTime);
System.out.println("newLocalDateTime: " + newLocalDateTime); // 2001-03-07T23:30

20. subtractFrom(Temporal)

Вычтите этот Period из указанного объекта Temporal и возвращайте новый объект Temporal .
// Inherited from ChronoPeriod interface
public Temporal subtractFrom(Temporal temporal)
Этот метод эквивалентен использованию метода Temporal.minus(TemporalAmount).
// Defined in Temporal interface.
public Temporal minus(TemporalAmount amount)
Например:
Period_subtractFrom_ex1.java
// Create Temporal object.
LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 10, 23, 30, 0);
System.out.println("localDateTime: " + localDateTime); // 2000-01-10T23:30

// 1 Year 1 month 25 days.
Period period = Period.of(1, 1, 25);

LocalDateTime newLocalDateTime = (LocalDateTime) period.subtractFrom(localDateTime);
System.out.println("newLocalDateTime: " + newLocalDateTime); // 1998-11-15T23:30
No ADS