Как добавить `Period` в` java.util.Date`? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть предопределенный набор классов, который использует java.util.Date (который нельзя изменить), и требуется добавить определенный период к объекту даты.

Я сталкивался с тем, как это можно сделать, используя java.time.Period и java.time.LocalDate, но не смог найти ничего общего с java.util.Date.

.....

Date baseDate = sdf.parse("2015-01-01 20:00");
Period twoMonthsAndFiveDays = Period.ofMonths(2).plusDays(5);

//ideal result would be a Date object with value "2015-03-06 20:00"

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm");

    // The given data
    String dateTimeString = "2015-01-01 20:00";
    Period twoMonthsAndFiveDays = Period.ofMonths(2).plusDays(5);

    ZonedDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter)
            .atZone(ZoneId.systemDefault());
    Instant newTime = dateTime.plus(twoMonthsAndFiveDays)
            .toInstant();
    Date oldfashionedDateObject = Date.from(newTime);

    System.out.println(oldfashionedDateObject);

Я установил для своего часового пояса Азию / Коломбо, запустил этот фрагмент и получил:

Пт 06 марта, 20:00:00 IST 2015

Если вам нужно начать с Date, который приходит из ваших предопределенных унаследованных классов:

    // The given data
    Date originalDate = getDateFromLegacyApi();
    Period twoMonthsAndFiveDays = Period.ofMonths(2).plusDays(5);

    Instant newTime = originalDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .plus(twoMonthsAndFiveDays)
            .toInstant();
    Date oldfashionedDateObject = Date.from(newTime);

Итак, преобразования

java.util.Date <--> Instant <--> ZonedDateTime

A ZonedDateTime знает, как добавить Period. Выполняйте преобразования в Date и обратно только тогда, когда вам это необходимо для обеспечения совместимости с вашими унаследованными классами.

1 голос
/ 01 ноября 2019

Поскольку вы уже знаете, как использовать Period на LocalDate объекте, вам нужно беспокоиться только о том, как преобразовать java.util.Date в java.time.LocalDate

// converting java.util.Date to java.time.LocalDate
Date today = new Date(); //<--your date to be converted/transformed
Instant instant = Instant.ofEpochMilli(today.getTime());
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDate localDate = localDateTime.toLocalDate();

Получено из:https://javarevisited.blogspot.com/2016/10/how-to-convert-javautildate-to-LocalDate-java8.html#ixzz63z8Djytf

...