Если вы используете Java 8 или новее, вы можете использовать новый API даты / времени. Смотрите этот ответ: stackoverflow.com/a/23910924/1115554
micha
4
новый DateTime (). plusDays (1) .toDate () ???
Пьетро
Ответы:
686
Нечто подобное должно сработать:
String dt ="2008-01-01";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd");Calendar c =Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE,1);// number of days to add
dt = sdf.format(c.getTime());// dt is now the new date
@Esko, c.roll (Calendar.DATE, true) не катит месяц в последний день месяца.
Сэм Хаслер
18
@ Аммар, это плохая идея, если ты ничего не понял
Никколо М.
13
Я процитирую некоторые JavaDocs ... Calendar.DATE: "... Это синоним DAY_OF_MONTH." Я хотел бы, чтобы JavaDocs разъяснил, что это увеличит большие поля (например, месяц и год). Calendar.roll «Добавляет или вычитает (увеличивает / уменьшает) одну единицу времени в заданном временном поле без изменения больших полей». Опять же, «большие поля» расплывчаты, но это похоже на комментарий Сэма. Я хотел бы, чтобы был StackOverflow для исправления старых JavaDocs.
jcalfee314
4
ребята, к сожалению, совершенно бесполезно добавлять дни, используя DATE, DAY_OF_MONTH или даже DAY_OF_YEAR - все они увеличиваются по модулю. Таким образом, с учетом Календаря 31-12-1970, add (DAY_OF_YEAR, 1) или roll (), однако roll (), наконец, вызывает add (), даст 01-01-1970. Я думаю, что единственный правильный способ - установить время с миллисекундами. Что касается меня, я никогда больше не использую класс Calendar.
Дмитрий Грязин
14
@Bagzerg: Вы не правы . add()накатит дату. Смотри на идеоне .
Жан Хоминал
212
Похоже, что Java значительно отстает от восьми шаров по сравнению с C #. Этот служебный метод показывает способ сделать в Java SE 6 с помощью метода Calendar.add (предположительно, единственный простой способ).
publicclassDateUtil{publicstaticDate addDays(Date date,int days){Calendar cal =Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);//minus number would decrement the daysreturn cal.getTime();}}
Чтобы добавить один день, в соответствии с заданным вопросом, назовите его следующим образом:
String sourceDate ="2012-02-29";SimpleDateFormat format =newSimpleDateFormat("yyyy-MM-dd");Date myDate = format.parse(sourceDate);
myDate =DateUtil.addDays(myDate,1);
Вы можете удалить вызовы парсера для построения DateTime. Использовать DateTime date = новый DateTime (dateString); Затем nextDay - это ISODateTimeFormat.date (). Print (date.plusDays (1)); См. Joda-time.sourceforge.net/api-release/org/joda/time/… для получения дополнительной информации.
К вашему сведению ... Проект Joda-Time сейчас находится в режиме обслуживания и рекомендует перейти на классы java.time . Оба усилия были во главе с одним и тем же человеком, Стивеном Коулборном. Таким образом, они разделяют схожие концепции, и миграция не является сложной.
Василий Бурк
40
Обратите внимание, что эта строка добавляет 24 часа:
d1.getTime()+1*24*60*60*1000
но эта строка добавляет один день
cal.add(Calendar.DATE,1);
В дни с переходом на летнее время (25 или 23 часа) вы получите разные результаты!
В Java 8 добавлен новый API для работы с датами и временем.
С Java 8 вы можете использовать следующие строки кода:
// parse date from yyyy-mm-dd patternLocalDate januaryFirst =LocalDate.parse("2014-01-01");// add one dayLocalDate januarySecond = januaryFirst.plusDays(1);
@Subho Для Android до 26, см. Проект ThreeTenABP, который адаптирует проект ThreeTen-Backport , бэк-порт, если большая часть функциональности java-времени, к Java 6 и Java 7.
Базиль Бурк
29
Вы можете использовать Simple java.util lib
Calendar cal =Calendar.getInstance();
cal.setTime(yourDate);
cal.add(Calendar.DATE,1);
yourDate = cal.getTime();
Этот Ответ дублирует содержание нескольких Ответов, включая принятый Ответ, полученный три года назад. Пожалуйста, удалите свой ответ или измените, чтобы добавить значение.
Василий Бурк
3
этот ответ чище, не разбирает дату посередине. «принятый ответ» слишком запутанный. хорошо, что вы добавили свое, не обращая внимания на автоматическое замечание
Лучший ответ, прямо к делу. Я согласен с Микки, просто не
обращайте
23
Date today =newDate();SimpleDateFormat formattedDate =newSimpleDateFormat("yyyyMMdd");Calendar c =Calendar.getInstance();
c.add(Calendar.DATE,1);// number of days to add String tomorrow =(String)(formattedDate.format(c.getTime()));System.out.println("Tomorrows date is "+ tomorrow);
Это даст завтрашнюю дату. c.add(...)параметры могут быть изменены с 1 на другое число для соответствующего приращения.
Вы можете сделать что-то вроде c.setTime (объект Date), чтобы установить конкретную дату перед добавлением.
Линь Лино
Я бы хотел, чтобы стандартные java-пакеты делали обработку дат менее запутанной ... Я имею в виду, что каждый раз, когда вы хотите иметь дело с датами, это такая боль ... просто напыщенная речь ...
Shn_Android_Dev
1
@Shn_Android_Dev Классы java.time, встроенные в Java 8 и более поздние версии, вытесняют ужасные старые классы даты и времени и отвечают вашему желанию. Также перенесен на Java 6/7 и более ранние версии Android в ThreeTen-Backport Backport и ThreeTenABP . Не нужно когда-либо использовать Dateили Calendarснова.
Василий Бурк
19
Если вы используете Java 8 , то делайте это так.
LocalDate sourceDate =LocalDate.of(2017,Month.MAY,27);// Source DateLocalDate destDate = sourceDate.plusDays(1);// Adding a day to source date.DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy-MM-dd");// Setting date formatString destDate = destDate.format(formatter));// End date
Если вы хотите использовать SimpleDateFormat , сделайте это следующим образом.
String sourceDate ="2017-05-27";// Start dateSimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd");Calendar calendar =Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate));// parsed date and setting to calendar
calendar.add(Calendar.DATE,1);// number of days to addString destDate = sdf.format(calendar.getTime());// End date
Нет, Вопрос задан для значения только для даты, а не для даты-времени. Так что пользуйся LocalDateклассом нет LocalDateTime.
Василий Бурк
1
Ваш ответ повторяет содержание как минимум четырех других ответов. Пожалуйста, объясните, как ваша добавленная стоимость превышает эти, или удалите, прежде чем собирать отрицательные голоса.
Василий Бурк
16
long timeadj =24*60*60*1000;Date newDate =newDate(oldDate.getTime ()+timeadj);
Это берет количество миллисекунд с начала эпохи из oldDate и добавляет миллисекунды за 1 день, а затем использует открытый конструктор Date () для создания даты с использованием нового значения. Этот метод позволяет добавить 1 день или любое количество часов / минут, а не только целые дни.
Это, вероятно, не то, что хотел ОП; он не учитывает корректировки типа перехода на летнее время, дополнительные секунды и т. д.
mrec
1
Переход на летнее время должен осуществляться с помощью часового пояса / региона. Мой пример показывал, как увеличивать на небольшие промежутки времени. При увеличении по дням високосные секунды могут быть проблемой, но при добавлении часов это менее вероятно, хотя все еще возможно.
Это создает значение даты и времени, когда Вопрос запрашивает только дату. Я предлагаю гораздо более разумный подход - LocalDateкласс в классах java.time для Java 8 и более поздних версий, а также обратный порт для Java 6 и Java 7, обнаруженный в проекте ThreeTen-Backport .
Это очень просто, пытаясь объяснить простым словом. получить сегодняшнюю дату, как показано ниже
Calendar calendar =Calendar.getInstance();System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE,1);
Теперь установите эту дату на один день вперед с помощью метода calendar.add, который принимает (константа, значение). Здесь константа может быть ДАТА, часы, минуты, секунды и т. Д., А значение - это значение константы. Как и на один день, константа впереди - Calendar.DATE, а ее значение равно 1, потому что мы хотим получить значение на один день вперед.
System.out.println(calendar.getTime());// print modified date which is завтрашнее свидание
Спасибо за желание внести свой вклад. Однако это уже есть в нескольких других ответах, так что я действительно не вижу смысла… Кроме этого ИМХО, никто не должен использовать плохо спроектированный и давно устаревший Calendarкласс в 2019 году.
Оле В.В.
6
Если вы используете Java SE 8 или выше, вы должны использовать новый API Date / Time
int days =7;LocalDate dateRedeemed =LocalDate.now();DateTimeFormatter formatter =DateTimeFormatter.ofPattern("dd/MM/YYYY");String newDate = dateRedeemed.plusDays(days).format(formatter);System.out.println(newDate);
Если вы должны конвертировать из java.util.Dateв java.time.LocalDate, вы можете использовать этот метод.
Если вы используете версию до Java SE 8, я советую вам использовать Joda-Time
Joda-Time обеспечивает качественную замену для классов даты и времени Java и является де-факто стандартной библиотекой даты и времени для Java до Java SE 8
int days =7;DateTime dateRedeemed =DateTime.now();DateTimeFormatter formatter =DateTimeFormat.forPattern("dd/MM/uuuu");String newDate = dateRedeemed.plusDays(days).toString(formatter);System.out.println(newDate);
Ваш шаблон для java.timeчасти неверен. Это должно быть dd/MM/uuuuэквивалентно JodaTime.
TiiJ7
5
Используйте DateFormatAPI для преобразования String в объект Date, затем используйте CalendarAPI для добавления одного дня. Дайте мне знать, если вы хотите конкретные примеры кода, и я могу обновить свой ответ.
Еще проще: отбросьте модуль форматирования и просто используйте его toString()для создания формата string i yyyy-MM-dd (и, если вы настаиваете, помните, что mmэто минуты, а MMмесяц).
Оле В.В.
3
Вы можете использовать этот пакет из "org.apache.commons.lang3.time":
Предлагать Dateзанятия в 2018 году - плохой совет. Мучительные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь являются устаревшими , вытесняются классами java.time, встроенными в Java 8 и Java 9. См. Учебное пособие Oracle . Смотрите другие ответы, используя LocalDateкласс.
Василий Бурк
Да, это лучший способ сделать LocalDate,
Шахид,
однако некоторые фреймворки, такие как jsf, имеют небольшие проблемы интеграции с API времени, поэтому иногда вам следует использовать Date; плюс среда Ява <8
Удача
1
@Lucke Большая часть функциональности java.time была перенесена на Java 6 & 7 в проекте ThreeTen-Backport . Далее адаптирован под более старый Android в проекте ThreeTenABP . Так что, действительно, не нужно когда-либо трогать эти кровавые ужасные старые классы даты и времени. Многие фреймворки были обновлены. Но не все. Поэтому, если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time , напишите свой новый код в java.time и выполните преобразование в / из старых типов, вызвав новые методы преобразования, добавленные в старые классы.
Василий Бурк
1
Этот код игнорирует критическую проблему часового пояса . В любой конкретный момент дата варьируется в зависимости от зоны. К SimpleDateFormatсожалению, класс вводит часовой пояс, неявно применяя текущую зону по умолчанию JVM. Таким образом, результаты этого кода будут отличаться в зависимости от текущего значения по умолчанию - и это значение по умолчанию может измениться в любой момент во время выполнения.
Василий Бурк
3
Это на самом деле просто. Один день содержит 86400000 миллисекунд. Итак, сначала вы получите текущее время в миллисекундах из системы, используя System.currentTimeMillis()затем добавьте 84000000 миллисекунд и используйтеDate класс для генерации формата даты в миллисекундах.
пример
String Today = new Date(System.currentTimeMillis()).toString();
Строка Сегодня будет 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
Струна завтра будет 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
Этот код использует ужасный Dateкласс, который был вытеснен много лет назад современными классами java.time . Намного проще просто:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Василий Бурк
2
Давайте проясним пример использования: вы хотите сделать арифметику календаря и начать / закончить с java.util.Date .
Некоторые подходы:
Преобразование в строку и обратно с SimpleDateFormat : это неэффективное решение.
Конвертировать в LocalDate : вы потеряете любую информацию о времени суток.
Преобразовать в LocalDateTime : это включает в себя больше шагов, и вам нужно беспокоиться о часовом поясе.
Преобразовать в эпоху с Date.getTime () : это эффективно, но вы рассчитываете с миллисекундами.
Никогда не смешивайте ужасные унаследованные классы, такие как Dateсовременные классы java.time, такие как Instant. В java.time классы полностью вытеснять устаревшие классы. Конкретно Instantзаменяет java.util.Date.
Василий Бурк
1
Не затрагивает вопрос. Вы используете классы, представляющие момент (дату с временем суток в контексте смещения или зоны). Но Вопрос касается только даты без времени суток и без часового пояса. Смотрите правильный ответ от Собрала и правильный ответ от Миха.
Базилик Бурк
0
Date newDate =newDate();
newDate.setDate(newDate.getDate()+1);System.out.println(newDate);
На моем компьютере, кажется, работает через границу месяца. После Sun Apr 30 16:25:33 CEST 2017приходит Mon May 01 16:25:33 CEST 2017. Это все еще обескураженное решение. Мало того, что метод устарел по уважительной причине, также в 2017 году у нас есть очень хорошие альтернативы Dateклассу.
Ответы:
Нечто подобное должно сработать:
источник
add()
накатит дату. Смотри на идеоне .Похоже, что Java значительно отстает от восьми шаров по сравнению с C #. Этот служебный метод показывает способ сделать в Java SE 6 с помощью метода Calendar.add (предположительно, единственный простой способ).
Чтобы добавить один день, в соответствии с заданным вопросом, назовите его следующим образом:
источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .java.time
В Java 8 и более поздних версиях пакет java.time делает это в значительной степени автоматически. ( Учебник )
Предполагая
String
ввод и вывод:источник
ZonedDateDateTime
и так иOffsetDateTime
естьplusDays
иminusDays
методы, а такжеLocalDate
LocalDate
.Я предпочитаю использовать DateUtils от Apache. Проверьте это http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . Это удобно, особенно когда вам нужно использовать его в нескольких местах в вашем проекте, и вы не хотите писать для этого свой метод с одним вкладышем.
API говорит:
Обратите внимание, что он возвращает новый объект Date и не вносит изменений в сам предыдущий.
источник
источник
Создайте объект Calendar и используйте метод add (Calendar.DATE, 1);
источник
Посмотрите на Joda-Time ( https://www.joda.org/joda-time/ ).
источник
Обратите внимание, что эта строка добавляет 24 часа:
но эта строка добавляет один день
В дни с переходом на летнее время (25 или 23 часа) вы получите разные результаты!
источник
В Java 8 добавлен новый API для работы с датами и временем.
С Java 8 вы можете использовать следующие строки кода:
источник
januaryFirst.plusDays(1)
нетdate.plusDays(1)
.Вы можете использовать Simple java.util lib
источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .Это даст завтрашнюю дату.
c.add(...)
параметры могут быть изменены с 1 на другое число для соответствующего приращения.источник
Date
илиCalendar
снова.Если вы используете Java 8 , то делайте это так.
Если вы хотите использовать SimpleDateFormat , сделайте это следующим образом.
источник
LocalDate
классом нетLocalDateTime
.Это берет количество миллисекунд с начала эпохи из oldDate и добавляет миллисекунды за 1 день, а затем использует открытый конструктор Date () для создания даты с использованием нового значения. Этот метод позволяет добавить 1 день или любое количество часов / минут, а не только целые дни.
источник
Начиная с Java 1.5 TimeUnit.DAYS.toMillis (1) выглядит более понятным для меня.
источник
LocalDate
класс в классах java.time для Java 8 и более поздних версий, а также обратный порт для Java 6 и Java 7, обнаруженный в проекте ThreeTen-Backport .В Java 8 простой способ сделать это:
источник
Instant.now().plus( 1 , ChronoUnit.DAYS )
?Это очень просто, пытаясь объяснить простым словом. получить сегодняшнюю дату, как показано ниже
Теперь установите эту дату на один день вперед с помощью метода calendar.add, который принимает (константа, значение). Здесь константа может быть ДАТА, часы, минуты, секунды и т. Д., А значение - это значение константы. Как и на один день, константа впереди - Calendar.DATE, а ее значение равно 1, потому что мы хотим получить значение на один день вперед.
System.out.println(calendar.getTime());// print modified date which is
завтрашнее свиданиеСпасибо
источник
В Java 8 вы можете использовать
java.time.LocalDate
Вы можете преобразовать в
java.util.Date
объект следующим образом.Вы можете
LocalDate
преобразовать в строку следующим образом.источник
Apache Commons уже имеет этот DateUtils.addDays (Дата, число, int) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java .util.Date,% 20int% 29, который вы используете или можете использовать JodaTime, чтобы сделать его более чистым.
источник
Просто укажите дату в строке и количество следующих дней
источник
Если вы хотите добавить одну единицу времени и ожидаете увеличения других полей, вы можете смело использовать метод add. Смотрите пример ниже:
Напечатает:
источник
источник
Calendar
класс в 2019 году.Если вы используете Java SE 8 или выше, вы должны использовать новый API Date / Time
Если вы должны конвертировать из
java.util.Date
вjava.time.LocalDate
, вы можете использовать этот метод.Если вы используете версию до Java SE 8, я советую вам использовать Joda-Time
источник
java.time
части неверен. Это должно бытьdd/MM/uuuu
эквивалентно JodaTime.Используйте
DateFormat
API для преобразования String в объект Date, затем используйтеCalendar
API для добавления одного дня. Дайте мне знать, если вы хотите конкретные примеры кода, и я могу обновить свой ответ.источник
Если вы используете Java 8,
java.time.LocalDate
иjava.time.format.DateTimeFormatter
можете сделать эту работу довольно простой.источник
toString()
для создания формата string i yyyy-MM-dd (и, если вы настаиваете, помните, чтоmm
это минуты, аMM
месяц).Вы можете использовать этот пакет из "org.apache.commons.lang3.time":
источник
Date
занятия в 2018 году - плохой совет. Мучительные старые классы даты и времени, такие какjava.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь являются устаревшими , вытесняются классами java.time, встроенными в Java 8 и Java 9. См. Учебное пособие Oracle . Смотрите другие ответы, используяLocalDate
класс.SimpleDateFormat
сожалению, класс вводит часовой пояс, неявно применяя текущую зону по умолчанию JVM. Таким образом, результаты этого кода будут отличаться в зависимости от текущего значения по умолчанию - и это значение по умолчанию может измениться в любой момент во время выполнения.Это на самом деле просто. Один день содержит 86400000 миллисекунд. Итак, сначала вы получите текущее время в миллисекундах из системы, используя
System.currentTimeMillis()
затем добавьте 84000000 миллисекунд и используйтеDate
класс для генерации формата даты в миллисекундах.пример
String Today = new Date(System.currentTimeMillis()).toString();
Строка Сегодня будет 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
Струна завтра будет 2019-05-10
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
Строка DayAfterTommorow будет 2019-05-11
источник
Date
класс, который был вытеснен много лет назад современными классами java.time . Намного проще просто:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Давайте проясним пример использования: вы хотите сделать арифметику календаря и начать / закончить с java.util.Date .
Некоторые подходы:
Рассмотрите возможность использования java.time.Instant :
источник
Date
современные классы java.time, такие какInstant
. В java.time классы полностью вытеснять устаревшие классы. КонкретноInstant
заменяетjava.util.Date
.источник
Sun Apr 30 16:25:33 CEST 2017
приходитMon May 01 16:25:33 CEST 2017
. Это все еще обескураженное решение. Мало того, что метод устарел по уважительной причине, также в 2017 году у нас есть очень хорошие альтернативыDate
классу.