



Создайте объект Calendar и используйте метод add (Calendar.DATE, 1);
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );
Что-то вроде этого должно помочь:
String dt = "2008-01-01"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("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
c.roll (Calendar.DATE, истина); было бы несколько лучше для ясности.
@Esko, c.roll (Calendar.DATE, true) не переносит месяц в последний день месяца.
@ Аммар, это плохая идея, если ты ничего не понял
Я процитирую некоторые JavaDocs ... Calendar.DATE: "... Это синоним DAY_OF_MONTH." Я бы хотел, чтобы в JavaDocs было разъяснено, что при этом увеличиваются поля большего размера (например, месяц и год). Calendar.roll «Добавляет или вычитает (вверх / вниз) одну единицу времени в данном поле времени, не изменяя более крупные поля» .. Опять же, «большие поля» нечеткие, но это, похоже, согласуется с комментарием Сэма. Я бы хотел, чтобы был StackOverflow для исправления старых JavaDocs.
Обратите внимание, что сейчас многие методы Date устарели, и в любом случае следует использовать Calendar вместо Date.
"yyyy-MM-dd" Соблюдайте - месяц должен быть в верхнем регистре. "mm" дал бы минуты :).
в Groovy (языке) это будет просто Date.parse ("yyyy-MM-dd", myDateStr) .next ()
ребята, к сожалению, добавлять дни через DATE, DAY_OF_MONTH или даже DAY_OF_YEAR совершенно бесполезно - все они увеличиваются по модулю. Итак, учитывая Календарь 31-12-1970, добавьте (DAY_OF_YEAR, 1) или roll (), однако roll (), наконец, вызовет add (), даст 01-01-1970. Думаю, единственный правильный способ - установить время в миллисекундах. Что касается меня, я больше никогда не использую класс Calendar.
@Bagzerg: Ты неправильный. add() откатит дату. Смотрите на идеона.
Я бы добавил одну важную вещь: убедитесь, что часовой пояс SimpleDateFormat и Calendar совпадает. Я случайно использовал UTC в качестве часового пояса SimpleDateFormat, но использовал местный часовой пояс для объекта Calendar. UTC не соблюдает летнее время, но мой местный часовой пояс соблюдает. Итак, когда весной я увеличил календарь на 1 день, когда мы «теряем» час, UTC записал, что он увеличился только на 23 часа - и, следовательно, в тот же день. Таким образом, в приведенном выше алгоритме дважды используется один и тот же день «2012-03-11». Осенью произойдет обратное, и день «2012-11-04» будет пропущен.
Вот почему я скучаю по C#. Для чего-то столь же простого, как получение даты в формате UTC или добавление дней к сегодняшней дате, требуется очень много строк кода. Полная библиотека каменного века.
@ developer747 В современной Java: LocalDate.parse( "2017-01-23" ).plusDays( 1 ).toString()
@SamHasler Если я добавляю 1 день к последнему дню месяца, месяц остается таким же, вместо перехода к следующему месяцу, как это сделать?
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.
Взгляните на Joda-Time (https://www.joda.org/joda-time/).
DateTimeFormatter parser = ISODateTimeFormat.date();
DateTime date = parser.parseDateTime(dateString);
String nextDay = parser.print(date.plusDays(1));
Вы можете удалить вызовы парсера для построения DateTime. Используйте DateTime date = new DateTime (dateString); Тогда nextDay - это ISODateTimeFormat.date (). Print (date.plusDays (1)); См. joda-time.sourceforge.net/api-release/org/joda/time/… для получения дополнительной информации.
Более подробный пример кода с использованием Joda-Time см. В разделе мой ответ по аналогичному вопросу, Как добавить один день к свиданию?.
К вашему сведению… Проект Joda-Time сейчас находится в режиме обслуживания и рекомендует перейти на классы java.time. Обеими усилиями руководил один и тот же человек, Стивен Коулборн. Таким образом, у них схожие концепции, и миграция несложна.
Обратите внимание, что эта строка добавляет 24 часа:
d1.getTime() + 1 * 24 * 60 * 60 * 1000
но эта строка добавляет один день
cal.add( Calendar.DATE, 1 );
В дни с переходом на летнее время (25 или 23 часа) вы получите разные результаты!
Кажется, что Java намного отстает от «восьмерки» по сравнению с C#. Этот служебный метод показывает способ работы в Java SE 6 с использованием Calendar.add метод (предположительно, единственный простой способ).
public class DateUtil
{
public static Date addDays(Date date, int days)
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days); //minus number would decrement the days
return cal.getTime();
}
}
Чтобы добавить один день в соответствии с заданным вопросом, назовите его следующим образом:
String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.
Я предпочитаю использовать DateUtils от Apache. Отметьте это http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html. Это удобно, особенно когда вам нужно использовать его в нескольких местах вашего проекта и вы не хотите писать для этого свой однострочный метод.
API говорит:
addDays(Date date, int amount) : Adds a number of days to a date returning a new object.
Обратите внимание, что он возвращает новый объект Date и не вносит изменений в сам предыдущий.
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);
fyi, Date.setDate () устарел
На моем компьютере это работает через месяц. После Sun Apr 30 16:25:33 CEST 2017 идет Mon May 01 16:25:33 CEST 2017. Однако это все еще обескураживающее решение. Этот метод устарел не только по уважительной причине, но и в 2017 году у нас есть очень хорошие альтернативы классу Date.
Apache Commons уже имеет этот DateUtils.addDays (Date date, int amount) http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateUtils.html#addDays%28java.util.Date,%20int%29, который вы используете, или вы можете использовать JodaTime, чтобы сделать его более чистым.
Date today = new Date();
SimpleDateFormat formattedDate = new SimpleDateFormat("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 Классы java.time, встроенные в Java 8 и более поздние версии, вытесняют ужасные старые классы даты и времени и отвечают вашему желанию. Также был перенесен на Java 6/7 и более ранние версии Android в проектах ThreeTen-Backport и ThreeTenABP. Нет необходимости снова использовать Date или Calendar.
В Java 8 и новее пакет java.time делает это в значительной степени автоматически. (Руководство)
Предполагая ввод и вывод String:
import java.time.LocalDate;
public class DateIncrementer {
static public String addOneDay(String date) {
return LocalDate.parse(date).plusDays(1).toString();
}
}
К вашему сведению, как ZonedDateDateTime, так и OffsetDateTime также имеют методы plusDays и minusDays, а также LocalDate
@BasilBourque Конечно, но информация, доступная в вопросе, касается LocalDate.
@DanielCSobral Ага. Просто добавляю ссылки в назидание читателям. Не критика.
В Java 8 добавлен новый API для работы с датой и временем.
В Java 8 вы можете использовать следующие строки кода:
// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");
// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);
Думаю, вы имели в виду januaryFirst.plusDays(1), а не date.plusDays(1).
Поддерживается только на android O developer.android.com/reference/java/time/package-summary.ht мл
@Subho Для Android до 26 см. Проект ThreeTenABP, который адаптирует проект ThreeTen-Backport, бэк-порт большей части функциональности время Java для Java 6 и Java 7.
Просто передайте дату в строке и количество следующих дней
private String getNextDate(String givenDate,int noOfDays) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
String nextDaysDate = null;
try {
cal.setTime(dateFormat.parse(givenDate));
cal.add(Calendar.DATE, noOfDays);
nextDaysDate = dateFormat.format(cal.getTime());
} catch (ParseException ex) {
Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
}finally{
dateFormat = null;
cal = null;
}
return nextDaysDate;
}
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);
Это занимает количество миллисекунд с начала эпохи от oldDate и добавляет миллисекунды на 1 день, а затем использует общедоступный конструктор Date () для создания даты с использованием нового значения. Этот метод позволяет добавить 1 день или любое количество часов / минут, а не только целые дни.
Вероятно, это не то, что хотел OP; в нем не учитываются настройки перехода на летнее время, дополнительные секунды и т. д.
Летнее время должно обрабатываться по часовому поясу / региону. Мой пример показывал, как увеличивать небольшую продолжительность. При увеличении на дни дополнительные секунды могут быть проблемой, но при добавлении часов это менее вероятно, хотя все же возможно.
Если вы хотите добавить одну единицу времени и ожидаете, что другие поля также будут увеличены, вы можете безопасно использовать метод добавления. См. Пример ниже:
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
Распечатает:
1970-12-31
1971-01-01
1970-12-31
Нет принятого ответа, и я почувствовал общую путаницу, если и другие поля будут обновлены.
вы можете использовать Simple java.util lib
Calendar cal = Calendar.getInstance();
cal.setTime(yourDate);
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();
Этот ответ дублирует содержание нескольких ответов, включая принятый ответ, полученных три года назад. Пожалуйста, удалите свой ответ или отредактируйте, чтобы добавить ценность.
этот ответ чище, дата в середине не анализируется. "принятый ответ" слишком запутан. хорошо, что вы добавили свое, не обращайте внимания на автоматическое замечание Василия
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.
Лучший ответ, прямо к делу. Я согласен с Микки, просто проигнорируйте комментарий Бэзила
В java 8 вы можете использовать java.time.LocalDate
LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1); //Add one to the day field
Вы можете преобразовать в объект java.util.Date следующим образом.
Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Вы можете преобразовать LocalDate в строку следующим образом.
String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Если вы используете Java 8, java.time.LocalDate и java.time.format.DateTimeFormatter могут упростить эту работу.
public String nextDate(String date){
LocalDate parsedDate = LocalDate.parse(date);
LocalDate addedDate = parsedDate.plusDays(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
return addedDate.format(formatter);
}
Еще проще: отбросьте форматтер и просто используйте toString() для создания строки в формате yyyy-MM-dd (и если вы настаиваете, помните, что mm - это минуты, а MM - месяц).
Поскольку Java 1.5, TimeUnit.DAYS.toMillis (1) мне кажется более чистым.
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));
Это создает значение даты и времени, где в вопросе запрашивается только дата. Я предлагаю гораздо более мудрый подход - это класс LocalDate в классах java.time для Java 8 и более поздних версий, а также обратный порт для Java 6 и Java 7, найденный в проекте ThreeTen-Backport.
Если вы используете Java 8, сделайте это так.
LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27); // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format
String destDate = destDate.format(formatter)); // End date
Если вы хотите использовать SimpleDateFormat, сделайте это так.
String sourceDate = "2017-05-27"; // Start date
SimpleDateFormat sdf = new SimpleDateFormat("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 add
String destDate = sdf.format(calendar.getTime()); // End date
Нет, вопрос запрашивал значение только даты, а не дату и время. Поэтому используйте класс LocalDate, а не LocalDateTime.
Ваш ответ повторяет содержание как минимум четырех других ответов. Пожалуйста, объясните, чем ваша добавленная стоимость помимо этого, или удалите, прежде чем собирать голоса против.
Это очень просто, попытаться объяснить простым словом. получите сегодняшнюю дату, как показано ниже
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 завтрашнее свидание
Спасибо
Вы можете использовать этот пакет из "org.apache.commons.lang3.time":
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date myNewDate = DateUtils.addDays(myDate, 4);
Date yesterday = DateUtils.addDays(myDate, -1);
String formatedDate = sdf.format(myNewDate);
Предлагать класс Date в 2018 году - плохой совет. Неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и Java 9. См. Руководство от Oracle. См. Другие ответы с использованием класса LocalDate.
Да, это лучший способ сделать это LocalDate,
однако у некоторых фреймворков, таких как jsf, есть небольшие проблемы с интеграцией с API времени, поэтому иногда следует использовать Date; плюс среда java <8
@Lucke Большая часть функциональности java.time была перенесена на Java 6 и 7 в проекте ThreeTen-Backport. Дальнейшая адаптация к более старому Android в проекте ThreeTenABP. Так что действительно не нужно прикасаться к этим чертовски ужасным старым классам свидания. Обновлены многие фреймворки. Но не все. Поэтому, если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time, напишите новый код в java.time и конвертируйте в / из старых типов, вызывая новые методы преобразования, добавленные к старым классам.
Этот код игнорирует важный вопрос часового пояса. В любой момент дата меняется в зависимости от зоны. К сожалению, класс SimpleDateFormat вводит часовой пояс, неявно применяя текущий пояс JVM по умолчанию. Таким образом, результаты этого кода будут зависеть от текущего значения по умолчанию - и это значение по умолчанию может измениться в любой момент времени выполнения в течение.
Давайте проясним случай использования: вы хотите выполнить календарную арифметику и начать / закончить с java.util.Date.
Некоторые подходы:
Рассмотрите возможность использования java.time.Instant:
Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);
Никогда не смешивайте ужасные устаревшие классы, такие как Date, с современными классами java.time, такими как Instant. Классы java.time полностью вытесняют унаследованные классы. В частности, Instant заменяет java.util.Date.
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender
Спасибо за желание внести свой вклад. Однако это уже есть в нескольких других ответах, поэтому я действительно не вижу смысла ... Кроме этого, IMHO никто не должен использовать плохо спроектированный и давно устаревший класс Calendar в 2019 году.
На мой взгляд, лучший ответ из всех вышеперечисленных.
На самом деле все просто.
Один день содержит 86400000 миллисекунд.
Итак, сначала вы получите текущее время в миллисекундах от Системы, используя System.currentTimeMillis(), а затем
добавьте 84000000 миллисекунд и используйте класс Date для создания формата даты в миллисекундах.
Пример
String Today = new Date(System.currentTimeMillis()).toString();
String Сегодня будет 2019-05-9
String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();
String Tommorow будет 10 мая 2019 г.
String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();
String DayAfterTommorow будет 2019-05-11
Этот код использует ужасный класс Date, который несколько лет назад был вытеснен современными классами java.time. Намного проще использовать: LocalDate.parse( "2019-01-23" ).plusDays( 1 )
С Java SE 8 или выше вы должны использовать новый Дата / время API
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, вы можете использовать этот метод.
public LocalDate asLocalDate(Date date) {
Instant instant = date.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
return zdt.toLocalDate();
}
С версией до Java SE 8 вы можете использовать Джода-Тайм
Joda-Time provides a quality replacement for the Java date and time classes and is the de facto standard date and time library for Java prior to 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);
Попробуйте этот метод:
public static Date addDay(int day) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, day);
return calendar.getTime();
}
Это выглядит правильно, но классы Calendar и Date плохо спроектированы и давно устарели, поэтому это не рекомендуемый способ. Предпочитаю LocalDate.now(ZoneId.systemDefault()).plusDays(day). Также я не вижу, чтобы вы вносили что-то важное, чего нет во втором по количеству голосов ответе Лизы.
Здравствуйте, я полностью согласен с вами, но я не видел второго по количеству голосов ответов до публикации своего.
Если вы используете Java 8 или новее, вы можете использовать новый api даты / времени. См. Этот ответ: stackoverflow.com/a/23910924/1115554