- Вычесть дни из даты в Java
- 2. java.time.LocalDateTime
- 3. java.util.Календарь
- 4. Джода-Время
- 5. Вывод
- Java отнять день от даты
- Add or Subtract Days, Months & Years to Date in Java
- Как вычесть день X из объекта Date в Java?
- 11 ответов
- Java 8 и более поздние версии
- Java 7 и более ранние версии
- Apache-Обще
- Java 8
Вычесть дни из даты в Java
В этом руководстве мы познакомимся с различными способами вычитания дней из объекта Date в Java.
Мы начнем с использования Date Time API, представленного в Java 8. После этого мы узнаем, как это сделать, используя классы из пакета java.util , и, наконец, добьемся того же с помощью с помощью библиотеки Joda-Time .
2. java.time.LocalDateTime
API даты/времени, представленный в Java 8, в настоящее время является наиболее жизнеспособным вариантом для вычисления даты и времени.
Давайте посмотрим, как вычесть дни из объекта java.util.LocalDateTime в Java 8 :
@Test public void givenLocalDate_whenSubtractingFiveDays_dateIsChangedCorrectly() LocalDateTime localDateTime = LocalDateTime.of(2022, 4, 20, 0, 0); localDateTime = localDateTime.minusDays(5); assertEquals(15, localDateTime.getDayOfMonth()); assertEquals(4, localDateTime.getMonthValue()); assertEquals(2022, localDateTime.getYear()); >
3. java.util.Календарь
Date и Calendar из java.util являются наиболее часто используемыми служебными классами до Java 8 для операций с датами.
Давайте вычтем пять дней из даты, используя java.util.Calendar :
@Test public void givenCalendarDate_whenSubtractingFiveDays_dateIsChangedCorrectly() Calendar calendar = Calendar.getInstance(); calendar.set(2022, Calendar.APRIL, 20); calendar.add(Calendar.DATE, -5); assertEquals(15, calendar.get(Calendar.DAY_OF_MONTH)); assertEquals(Calendar.APRIL, calendar.get(Calendar.MONTH)); assertEquals(2022, calendar.get(Calendar.YEAR)); >
Мы должны быть осторожны при их использовании, поскольку они имеют несколько конструктивных недостатков и не являются потокобезопасными.
Подробнее о взаимодействии с унаследованным кодом и различиях между двумя API мы можем прочитать в статье о миграции на новый Java 8 Date Time API .
4. Джода-Время
Мы можем использовать Joda-Time как лучшую альтернативу исходному решению Java для обработки даты и времени. Библиотека предоставляет более интуитивно понятный API, несколько календарных систем, безопасность потоков и неизменяемые объекты.
Чтобы использовать Joda-Time , нам нужно включить его как зависимость в файл pom.xml :
dependency> groupId>joda-timegroupId> artifactId>joda-timeartifactId> version>2.10.14version> dependency>
Давайте вычтем пять дней из объекта DateTime Joda-Time :
@Test public void givenJodaDateTime_whenSubtractingFiveDays_dateIsChangedCorrectly() DateTime dateTime = new DateTime(2022, 4, 20, 12, 0, 0); dateTime = dateTime.minusDays(5); assertEquals(15, dateTime.getDayOfMonth()); assertEquals(4, dateTime.getMonthOfYear()); assertEquals(2022, dateTime.getYear()); >
Joda-Time — хорошее решение для устаревшего кода. Однако проект официально «завершен», и автор библиотеки рекомендует переход на Java 8 Date/Time API.
5. Вывод
В этой короткой статье мы рассмотрели несколько способов вычитания дней из объекта даты.
Мы достигли этого, используя java.time.LocalDateTime и решения до Java 8: java.util.Calendar и библиотеку Joda-Time.
Как обычно, исходный код доступен на GitHub .
Java отнять день от даты
Класс LocalDate из пакета java.time предназначен для работы с датами. Функционал этого класса позволяет создавать даты и изменять их, добавляя и отнимая необходимое количество дней/месяцев/лет.
Основные методы LocalDate:
- static LocalDate now() : возвращает объект, который представляет текущую дату
- static LocalDate of(int year, int month, int day) : возвращает объект, который представляет дату с определенными годом, месяцем и днем
- int getYear() : возвращает год даты
- int getMonthValue() : возвращает месяц
- int getDayOfMonth() : возвращает день месяца (значение от 1 до 31)
- int getDayOfYear() : возвращает номер дня года (значение от 1 до 365)
- DayOfWeek getDayOfWeek() : возвращает день недели в виде значения перечисления DayOfWeek
- LocalDate plusDays(int n) : добавляет к дате некоторое количество дней
- LocalDate plusWeeks(int n) : добавляет к дате некоторое количество недель
- LocalDate plusMonths(int n) : добавляет к дате некоторое количество месяцев
- LocalDate plusYears(int n) : добавляет к дате некоторое количество лет
- LocalDate minusDays(int n) : отнимает от даты некоторое количество дней
- LocalDate minusMonths(int n) : отнимает от даты некоторое количество месяцев
- LocalDate minusWeeks(int n) : отнимает от даты некоторое количество недель
- LocalDate minusYears(int n) : отнимает от даты некоторое количество лет
Получение информации о текущей дате:
import java.time.DayOfWeek; import java.time.LocalDate; public class Program < public static void main(String[] args) < LocalDate date = LocalDate.now(); // получаем текущую дату int year = date.getYear(); int month = date.getMonthValue(); int dayOfMonth = date.getDayOfMonth(); DayOfWeek dayOfWeek = date.getDayOfWeek(); System.out.println(date); System.out.println(dayOfWeek); System.out.printf("%d.%d.%d \n", dayOfMonth, month, year); >>
Создание и получение информации по случайной дате:
LocalDate date = LocalDate.of(1914, 12, 31); System.out.println(date);
Операции с датами — добавление и удаление:
LocalDate date = LocalDate.of(1914, 7, 28); date = date.plusYears(4); date = date.plusMonths(3); date = date.plusDays(14); System.out.println(date); // 1918-11-11 date = date.minusMonths(10); date = date.minusDays(3); System.out.println(date); // 1918-01-08
Add or Subtract Days, Months & Years to Date in Java
Java examples to add or subtract days, months or years from a given date using various date-time classes. If your requirement is to add or subtract only the business days then read the linked article.
1. Add or Subtract Days, Months, Years to Date since Java 8
This recommended approach if we are using JDK 1.8 or later.
New java.time classes LocalDate , LocalDateTime and ZonedDateTime have following plus methods to add days to a date.
- plusDays(long n) – adds n days to date.
- plusWeeks(long n) – adds n weeks to date.
- plusMonths(long n) – adds n months to date.
- plusYears(long n) – adds n years to date.
Similarly, use the following minus methods to subtract days from a date.
- minusDays(long n) – subtracts n days from date.
- minusWeeks(long n) – subtracts n weeks from date.
- minusMonths(long n) – subtracts n months from date.
- minusYears(long n) – subtracts n years from date.
Before returning the modified date, these methods modify the other date fields as well to ensure that the result date is a valid date.
These methods throw DateTimeException if the result exceeds the supported date range.
//1. Add and substract 1 day from LocalDate LocalDate today = LocalDate.now(); //Today LocalDate tomorrow = today.plusDays(1); //Plus 1 day LocalDate yesterday = today.minusDays(1); //Minus 1 day //2. Add and substract 1 month from LocalDateTime LocalDateTime now = LocalDateTime.now(); //Current Date and Time LocalDateTime sameDayNextMonth = now.plusMonths(1); //2018-08-14 LocalDateTime sameDayLastMonth = now.minusMonths(1); //2018-06-14 //3. Add and substract 1 year from LocalDateTime LocalDateTime sameDayNextYear = now.plusYears(1); //2019-07-14 LocalDateTime sameDayLastYear = now.minusYears(1); //2017-07-14
2. Add or Subtract Days from java.util.Date
Till Java 7, the only good way to add days to Date was using Calendar class.
The calendar.add(int field, int amount) method takes two arguments, i.e., field type and the field value. We can use this method to add days, months or any time unit in the underlying Date class.
- To add a time unit, pass a positive number in the method.
- To subtract a time unit, pass a negative number in the method.
Date today = new Date(); System.out.println(today); Calendar cal = Calendar.getInstance(); cal.setTime(today); // Adding time cal.add(Calendar.YEAR, 2); cal.add(Calendar.MONTH, 2); cal.add(Calendar.DATE, 2); cal.add(Calendar.DAY_OF_MONTH, 2); // Subtracting time cal.add(Calendar.YEAR, -3); cal.add(Calendar.MONTH, -3); cal.add(Calendar.DATE, -3); cal.add(Calendar.DAY_OF_MONTH, -3); // convert calendar to date Date modifiedDate = cal.getTime(); System.out.println(modifiedDate);
Как вычесть день X из объекта Date в Java?
Следующие ссылки могут быть полезны для вас. [Введите описание ссылки здесь] [1] [введите описание ссылки здесь] [2] [1]: stackoverflow.com/questions/212321/… [2]: stackoverflow.com/questions/ 2623610 / .
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date , теперь унаследованы и заменены классами java.time .
11 ответов
Java 8 и более поздние версии
С изменением API дат Java 8, используйте LocalDate
LocalDate date = LocalDate.now().minusDays(300);
Java 7 и более ранние версии
Calendar cal = Calendar.getInstance(); cal.setTime(dateInstance); cal.add(Calendar.DATE, -30); Date dateBefore30Days = cal.getTime();
Это 4-летний ответ. в последние версии были внесены новые изменения API DateTime. Я отредактирую ответ
К вашему сведению, старые проблемные классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleTextFormat , теперь унаследованы и заменены классами java.time . Смотрите Учебник по Oracle .
@JigarJoshi было бы замечательно, если бы вы обновили свой ответ с помощью API Java 8. Ваш ответ принят первым, который люди видят первым.
Большая часть функций java.time перенесена в Java 6 и Java 7 в проекте ThreeTen-Backport . Далее адаптирован для более ранней версии Android в проекте ThreeTenABP . Смотрите Как использовать ThreeTenABP… .
@JigarJoshi это хороший ответ, и, конечно, также @Tim рекомендации для использования. йода-время.
Я хочу добавить больше возможностей для вычитания дней из java.util.Date .
Apache-Обще
Одна из возможностей — использовать apache-commons-lang. Вы можете сделать это с помощью DateUtils следующим образом:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);
Разумеется, добавить зависимость от commons-lang чтобы сделать только дату, вычесть ее, вероятно, не очень хорошие варианты, однако, если вы уже используете commons-lang это хороший выбор. Также есть удобные методы addYears , addMonths , addWeeks и т.д., Взгляните на api здесь.
Java 8
Другой возможностью является использование нового LocalDate из Java 8 с использованием minusDays(long days) :
LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);
Нет смысла использовать LocalDateTime как этот класс намеренно не имеет понятия о часовом поясе или смещении от UTC. Используйте это только тогда, когда зона / смещение неизвестна или не имеет значения. Вместо этого используйте LocalDate и передайте ZoneId при вызове его метода now . Смотрите правильный ответ Якоба ван Лингена.
@BasilBourque После вашего совета я проверяю API, и вы совершенно правы, поэтому я обновляю ответ. Благодарю.
Брайан Монтельяно хотел бы прокомментировать: в DateUtils не должно быть никаких s , это просто DateUtil .
Я бы порекомендовал вам использовать библиотеку DateTime, найденную здесь: https://www.joda.org/joda-time/
Это одна из моих самых первых зависимостей, которую я добавляю почти к каждому проекту Java, который я создаю.
Если у вас есть код устаревшего кода, требующий даты или календари, вы можете преобразовать его из DateTimes.
Таким образом, вычитание 300 дней будет таким же простым, как:
Date date = new Date(); // Or where ever you get it from Date daysAgo = new DateTime(date).minusDays(300).toDate();
Instant now = Instant.now(); //current date Instant before = now.minus(Duration.ofDays(300)); Date dateBefore = Date.from(before);
Я имею в виду API Java 8, а не 7. И упоминание пакета java.time может помочь. Кроме того, обычно ожидается некоторое обсуждение / объяснение переполнения стека, а не просто фрагмент кода. Вы должны определенно объяснить Duration поскольку это добавленная стоимость вашего ответа по сравнению с существующим Ван Лингена .
С Java 8 это действительно просто:
LocalDate date = LocalDate.now().minusDays(300);
Подробное руководство по новому api можно найти здесь.
Я предлагаю всегда передавать необязательный часовой пояс (или смещение от UTC) этому методу now . Если опущено, текущий часовой пояс JVM по умолчанию применяется неявно и незаметно. Это значение по умолчанию находится вне вашего контроля и может измениться в любой момент, даже во время выполнения. Пример: LocalDate.now( ZoneId.of( «America/Montreal» ) .
Как вы можете видеть ЗДЕСЬ, есть много манипуляций, которые вы можете сделать. Вот пример, показывающий, что вы могли бы сделать!
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); //Add one day to current date. cal.add(Calendar.DATE, 1); System.out.println(dateFormat.format(cal.getTime())); //Substract one day to current date. cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); System.out.println(dateFormat.format(cal.getTime())); /* Can be Calendar.DATE or * Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND */