Кто-нибудь знает простой способ использования календаря Java для вычитания X дней из даты?
Я не смог найти ни одной функции, которая позволяла бы мне напрямую вычитать X дней из даты в Java. Может ли кто-нибудь указать мне правильное направление?
java
calendar
subtraction
fmsf
источник
источник
java.util.Calendar
теперь, унаследованы , заменены классами java.time . Смотрите Учебник по Oracle .Ответы:
Взято из документации здесь :
источник
Calendar.DAY_OF_MONTH
в этом случае, так как он не будет обрабатывать бросок между месяцами, как вы хотели бы. ИспользуйтеCalendar.DAY_OF_YEAR
вместо этогоВы можете использовать
add
метод и передать ему отрицательное число. Тем не менее, вы также можете написать более простой метод, который не используетCalendar
класс, такой как следующийЭто получает значение метки времени даты (миллисекунды с начала эпохи) и добавляет правильное количество миллисекунд. Вы можете передать отрицательное целое число для параметра days, чтобы выполнить вычитание. Это было бы проще, чем «правильное» календарное решение:
Обратите внимание, что оба эти решения изменяют
Date
объект, переданный в качестве параметра, а не возвращают совершенно новыйDate
. Любая функция может быть легко изменена, чтобы сделать это другим способом при желании.источник
java.util.Calendar
теперь, унаследованы , заменены классами java.time . Смотрите Учебник по Oracle .Ответ Ансона подойдет для простого случая, но если вы собираетесь делать более сложные вычисления даты, я бы порекомендовал проверить Joda Time . Это сделает вашу жизнь намного проще.
К вашему сведению в Joda Time вы могли бы сделать
источник
ТЛ; др
Лучше указать часовой пояс.
подробности
Старые классы даты и времени, связанные с ранними версиями Java, такими как
java.util.Date
/.Calendar
, оказались проблематичными, запутанными и ошибочными. Избежать их.java.time
Java 8 и более поздние версии заменяют эти старые классы новой структурой java.time. Смотрите учебник . Определено JSR 310 , вдохновлено Joda-Time и расширено проектом ThreeTen-Extra . Проект ThreeTen-Backport переносит классы на Java 6 и 7; проект ThreeTenABP для Android.
Вопрос неопределенный, неясно, запрашивает ли он только дату или дату-время.
LocalDate
Только для даты, без времени суток, используйте
LocalDate
класс. Обратите внимание, что часовой пояс имеет решающее значение при определении даты, такой как «сегодня».ZonedDateTime
Если вы имели в виду дату и время, используйте
Instant
класс, чтобы получить момент времени на UTC . Оттуда установите часовой пояс, чтобы получитьZonedDateTime
объект.О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в
java.sql.*
классах.Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
редактировать: парсеру, похоже, не нравится ссылка на Javadoc, так что здесь она в текстовом виде:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
источник
Вместо того, чтобы писать свои собственные,
addDays
как предложено Эли, я бы предпочел использоватьDateUtils
из Apache . Это удобно, особенно когда вам нужно использовать его в разных местах вашего проекта.API говорит:
addDays(Date date, int amount)
Добавляет количество дней к дате, возвращая новый объект.
Обратите внимание, что он возвращает новый
Date
объект и не вносит изменений в сам предыдущий.источник
Это может быть легко сделано следующим
источник
LocalDate
гораздо проще и целесообразнее.Кто-то так рекомендовал Joda Time - я использую этот класс CalendarDate http://calendardate.sourceforge.net
Это несколько конкурирующий проект с Joda Time, но гораздо более базовый только в 2 классах. Это очень удобно и отлично работает для того, что мне нужно, так как я не хотел использовать пакет больше, чем мой проект. В отличие от аналогов Java, его наименьшая единица - день, поэтому это действительно дата (без указания миллисекунд или чего-то еще). После создания даты все, что вы делаете для вычитания, это что-то вроде myDay.addDays (-5), чтобы вернуться на 5 дней назад. Вы можете использовать его, чтобы найти день недели и тому подобное. Другой пример:
И:
источник
Я считаю, что с помощью java.time.Instant можно добиться чистого и приятного способа вычитания или сложения любой единицы времени (месяцы, дни, часы, минуты, секунды, ...). класса .
Пример для вычитания 5 дней из текущего времени и получения результата в виде даты:
Еще один пример для вычитания 1 часа и добавления 15 минут:
Если вам нужно больше точности, Instance измеряет до наносекунд. Методы манипулирования наносекундной частью:
Также имейте в виду, что Дата не так точна, как Мгновенная.
источник
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Второе решение Эли Кортрайт неверно, оно должно быть:
источник
addDays
; его решение верное. Если вы хотите вычесть дни из даты, вы передаете отрицательное значение дляdays
.