как работает .minusDays() в Java

186
03 января 2019, 23:10

В ходе переписывания исходного кода из учебника столкнулся с такой строкой:

date = date.minusDays(today-1); // задать первый день месяца 

Попытавшись разобраться, как это работает так ни к чему и не пришел. В документации указано, что этот метод "Returns a copy of this LocalDate with the specified number of days subtracted.", то есть если я создаю объект date, и инициализирую его текущей датой (18.9.2018 например), то согласно описания .minusDays() я должен получить 17.9.2018.

В действительности я получаю 1.9.2018, отладчик это подтверждает:

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

Полный текст программы

import java.time.*;
public class CalendarTest {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        int month = date.getMonthValue();
        int today = date.getDayOfMonth();
        date = date.minusDays(today-1);
        DayOfWeek weekday = date.getDayOfWeek();
        int value = weekday.getValue();
        System.out.println("Mon Tue Wed Thu Fri Sat Sun");
        for (int i = 1; i<value; i++) {
            System.out.print("    ");
        }
        while (date.getMonthValue() == month) {
            System.out.printf("%3d", date.getDayOfMonth());
            if (date.getDayOfMonth() == today) {
                System.out.print("*");
            }
            else {
                System.out.print(" ");
            }
            date = date.plusDays(1);
            if (date.getDayOfWeek().getValue() == 1) {
                System.out.println();
            }
        }
    }
}
Answer 1

Все вроде правильно.

LocalDate date = LocalDate.now();

Здесь вы получаете текущую дату - 18.9.2018

int today = date.getDayOfMonth();

здесь - текущий день месяца по счету, это 18

date = date.minusDays(today-1);

вычитаете одно из другого 18.9.2018 - (18 дней - 1 день) = 1.09.2018Т.о. здесь вы не получаете какой то новой даты инициализированной вчерашним днем, а просто проводите математическую операцию по вычитанию параметра в скобках из даты, полученной изначально.

READ ALSO
Странный WARNING при старте spring-boot-data-mongodb приложения

Странный WARNING при старте spring-boot-data-mongodb приложения

При старте приложения в логе присутствует вот такой Warning:

177
Как правильно написать REST API?

Как правильно написать REST API?

Решил разобраться с REST APIДопустим, пусть есть водитель и у него есть машина, которая должна уметь ездить, останавливаться, каждые 100км нужна...

166