Java 8 вычитают даты, но держат час - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу вычесть 7 дней с этого момента, но сохранив время, поэтому если сейчас 09/09/2018 в 18:30, получить 09.09.2008 в 18:30 ...

Я пробовал:

public static Date subtractDays (int numDaysToSubstract) {
        LocalDate now = LocalDate.now().minusDays(numDaysToSubstract); 
        return Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

Но я получил 05.09.2008 в 00:00

Ответы [ 5 ]

0 голосов
/ 13 сентября 2018

Из других ответов, опубликованных до сих пор, неясно, как они справляются с летним временем (DST) и другими аномалиями времени. И они делают это по-другому. Чтобы было яснее, что вы хотите 18.30 на прошлой неделе, если время сейчас 18.30, независимо от того, произошел ли переход к летнему времени или из него, я предлагаю использовать ZonedDateTime:

    System.out.println("Now:                 " + Instant.now());
    Instant aWeekAgo = ZonedDateTime.now(ZoneId.of("Europe/Madrid"))
            .minusWeeks(1)
            .toInstant();
    System.out.println("A week ago in Spain: " + aWeekAgo);

Поскольку летнее время в Испании не заканчивалось и не начиналось в течение последней недели, запуск кода только что дал такое же время дня и в UTC (что печатает Instant):

Now:                 2018-09-13T09:46:58.066957Z
A week ago in Spain: 2018-09-06T09:46:58.102680Z

Я верю, что вы адаптируете идею к своему коду.

0 голосов
/ 12 сентября 2018
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {

    public static String subtractDays (int numDaysToSubstract) {
        LocalDateTime now = LocalDateTime.now().minusDays(numDaysToSubstract);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        String formatDateTime = now.format(formatter);


        return formatDateTime;
    }
    public static void main(String[] args){

        System.out.println(subtractDays(7));

    }
}
0 голосов
/ 12 сентября 2018

Вы должны использовать LocalDateTime вместо LocalDate

LocalDate это просто описание даты без времени или часового пояса

public static Date subtractDays (int numDaysToSubstract) {
    LocalDateTime now = LocalDateTime.now().minusDays(numDaysToSubstract); 
    return Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
}
0 голосов
/ 12 сентября 2018

Как и предполагали другие, LocalDate и atStartOfDay должны были быть красными флагами, основанными только на их имени.Это неправильный тип для описания времени и неправильный метод для поддержания времени.

Также бессмысленно проходить через LocalDateTime, а затем преобразовывать его в Instant.Просто используйте Instant прямо вверх

public static Date subtractDays(int numDaysToSubstract) {
    return Date.from(Instant.now().minus(numDaysToSubstract, ChronoUnit.DAYS));
    // or
    // return Date.from(Instant.now().minus(Duration.ofDays(numDaysToSubstract)));

}

(я предполагаю, что вы используете java.util.Date из-за совместимости с некоторыми старыми API.)

0 голосов
/ 12 сентября 2018

Используйте класс LocalDateTime вместо LocalDate (который не содержит компонент времени ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...