2009-06-17 2 views
154

Я хочу добавить еще один день в определённую дату. Как я могу это сделать?Как добавить один день к дате?

Date dt = new Date(); 

Теперь я хочу добавить один день к этой дате.

+3

возможно дубликат [Как я могу увеличивать дата на один день в Java?] (http://stackoverflow.com/questions/428918/how-can-i-increment-a-date-by-one-day-in-java) –

+0

Возможный дубликат [How могу ли я увеличить дату на один день в Java?] (http://stackoverflow.com/questions/428918/how-can-i-increment- a-date-by-one-day-in-java) – GSerg

ответ

369

дано Date dt у вас есть несколько возможностей:

Solution 1: Вы можете использовать Calendar класс для этого:

Date dt = new Date(); 
Calendar c = Calendar.getInstance(); 
c.setTime(dt); 
c.add(Calendar.DATE, 1); 
dt = c.getTime(); 

Решение 2: Вы должны серьезно рассмотреть вопрос об использовании Joda-Time library, из-за различных недостатков класса Date. С Joda-Time вы можете сделать следующее:

Date dt = new Date(); 
DateTime dtOrg = new DateTime(dt); 
DateTime dtPlusOne = dtOrg.plusDays(1); 

Решение 3: С Java 8 вы также можете использовать новый JSR 310 API (который вдохновлен Joda-Time):

LocalDateTime.from(dt.toInstant()).plusDays(1); 
+2

Для решения 1 (по крайней мере) вы также можете передать ему отрицательное значение (например, -1 для получения предыдущего дня). – welshk91

+3

Все решения поддерживают отрицательные смещения, даже с их отрицательными аналогами, поэтому вместо 'plusDays (1)' можно также использовать 'minusDays (-1)'. –

+3

Решение 3 не заканчивается датой .. он заканчивается с LocalDateTime – Charbel

3

Чтобы сделать его более тонким, чем java, основным принципом было бы преобразовать в какой-то линейный формат даты, юлианские дни, измененные юлианские дни, секунды с какой-то эпохи и т. Д., Добавить свой день и преобразовать обратно.

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

Я предостерегаю вы, что правильное выполнение этих процедур конверсии может быть затруднено. Существует огромное количество разных способов, с помощью которых люди теряют время, самым последним примером высокого профиля является MS Zune. Не делайте слишком много удовольствия в MS, хотя, Это не помогает в том, что существует несколько разных временных форматов, скажем, TAI vs TT.

54
Date today = new Date(); 
Date tomorrow = new Date(today.getTime() + (1000 * 60 * 60 * 24)); 

Дата имеет конструктор с использованием mi lliseconds с UNIX-эпохи. метод getTime() дает вам это значение. Таким образом, добавление миллисекунд в течение дня, делает трюк. Если вы хотите регулярно делать такие манипуляции, я рекомендую определить константы для значений.

Важный намек: это неверно во всех случаях. Прочтите комментарий WARNING ниже.

+43

ВНИМАНИЕ! Добавление 1000 * 60 * 60 * 24 миллисекунды к дате java в один прекрасный день добавит нулевые дни или два дня к исходной дате в условиях прыжковых секунд, летнего времени и т.п. Если вам нужно быть на 100% уверенным, добавляется только один день, это решение не тот, который нужно использовать. –

+2

Вы правы. Я добавляю подсказку к этому комментарию к моему ответу. – Mnementh

+1

Downvoting, поскольку это очень неправильный ответ из-за как летнего времени, так и секунд прыжка. Используйте Календарь или время Джоды. – stolsvik

4

Использование объекта DateTime obj.Add, чтобы добавить, что вы хотите, чтобы день и т. Д. Надеюсь, что это работает :)

9

Это увеличит любую дату ровно один

String untildate="2011-10-08";//can take any date in current format  
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
Calendar cal = Calendar.getInstance();  
cal.setTime(dateFormat.parse(untildate));  
cal.add(Calendar.DATE, 1);  
String convertedDate=dateFormat.format(cal.getTime());  
System.out.println("Date increase by one.."+convertedDate); 
3

Я предпочитаю joda для даты и времени арифметике, потому что это гораздо лучше читаемым:

Date tomorrow = now().plusDays(1).toDate(); 

Или

endOfDay(now().plus(days(1))).toDate() 
startOfDay(now().plus(days(1))).toDate() 
+0

и производительность не важна? Если вы должны делать эти вычисления во многих случаях, это очень дорого. Считываемое - это одно, но нужно думать более широко. – davidxxx

7

Обновление: Библиотека Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на классы java.time.

java.time

LocalDate.of(2017 , Month.JANUARY , 23) 
     .plusDays(1) 

Лучше всего, чтобы избежать java.util.Date класса в целом. Но если вы это сделаете, вы можете преобразовать между старыми старыми классами времени и современными классами java.time. Посмотрите на новые методы, добавленные в старые классы.

Класс Instant, близкий к эквиваленту Date, оба являются моментом на временной шкале. Instant разрешает наносекунды, а Date - миллисекунды.

Instant instant = myUtilDate.toInstant() ; 

Вы можете добавить этот день к этому, но имейте это в виду в UTC. Поэтому вы не будете настраивать аномалии, такие как переход на летнее время. Укажите единицу времени с помощью класса ChronoUnit.

Instant nextDay = instant.plus(1 , ChronoUnit.DAYS) ; 

Если вы хотите, чтобы быть подкованной с часовыми поясами, указать ZoneId получить ZonedDateTime.

ZoneId z = ZoneId.of("America/Montreal") ; 
ZonedDateTime zdt = instant.atZone(z) ; 
ZonedDateTime zdtNextDay = zdt.plusDays(1) ; 

Joda время

Joda-Time 2,3 библиотека делает этот вид даты и время работы гораздо проще. Класс java.util.Date в комплекте с Java, как известно, хлопотно, и его следует избегать.

Вот пример кода.

Ваш java.util.Date преобразуется в объект Joda-Time DateTime. В отличие от j.u.Date, DateTime действительно знает свой назначенный часовой пояс. Часовой пояс имеет решающее значение, поскольку добавление дня для получения того же wall-clock time завтра может означать внесение корректировок, например, для 23-часового или 25-часового дня в случае Daylight Saving Time (DST) здесь, в Соединенных Штатах. Если вы укажете time zone, Joda-Time может выполнить такую ​​настройку. После добавления дня мы преобразуем объект DateTime обратно в объект java.util.Date.

java.util.Date yourDate = new java.util.Date(); 

// Generally better to specify your time zone rather than rely on default. 
org.joda.time.DateTimeZone timeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles"); 
DateTime now = new DateTime(yourDate, timeZone); 
DateTime tomorrow = now.plusDays(1); 
java.util.Date tomorrowAsJUDate = tomorrow.toDate(); 

самосвала утешать ...

System.out.println("yourDate: " + yourDate); 
System.out.println("now: " + now); 
System.out.println("tomorrow: " + tomorrow); 
System.out.println("tomorrowAsJUDate: " + tomorrowAsJUDate); 

При запуске ...

yourDate: Thu Apr 10 22:57:21 PDT 2014 
now: 2014-04-10T22:57:21.535-07:00 
tomorrow: 2014-04-11T22:57:21.535-07:00 
tomorrowAsJUDate: Fri Apr 11 22:57:21 PDT 2014 
7

Как уже упоминалось в топ ответ, так как Java 8 можно сделать:

Date dt = new Date(); 
LocalDateTime.from(dt.toInstant()).plusDays(1); 

, но иногда это может привести к DateTimeException, как это:

java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-11-29T03:20:10.800Z of type java.time.Instant 

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

LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1); 
3

В особом случае, если вы попросили сделать свой собственный класс даты, возможно, с вашего компьютера Программирование Профессор; Этот метод будет очень удачным.

public void addOneDay(){ 
    int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
    day++; 
    if (day> months[month-1]){ 
     month++; 
     day = 1; 
     if (month > 12){ 
      year++; 
      month = 1; 
     } 
    } 
} 
+0

Для точки зрения производительности решение очень интересно. +1 – davidxxx

+0

Это не работает с високосными годами. –

2

Java 1.8 версия имеет приятное обновление для времени данных API.

Вот фрагмент кода:

LocalDate lastAprilDay = LocalDate.of(2014, Month.APRIL, 30); 
    System.out.println("last april day: " + lastAprilDay); 
    LocalDate firstMay = lastAprilDay.plusDays(1); 
    System.out.println("should be first may day: " + firstMay); 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd"); 
    String formatDate = formatter.format(firstMay); 
    System.out.println("formatted date: " + formatDate); 

Выход:

last april day: 2014-04-30 
should be first may day: 2014-05-01 
formatted date: 01 

Для получения дополнительной информации см Java документацию к этим классам:

3

лучше всего использовать:

 long currenTime = System.currentTimeMillis(); 
     long oneHourLater = currentTime + TimeUnit.HOURS.toMillis(1l); 

Кроме того, вы можете добавить месяцы, дни, минуты и т.д.

4

вы можете использовать этот метод после импорта org.apache.commons .lang.time.DateUtils:

DateUtils.addDays(new Date(), 1)); 
1

U можно попробовать java.util.Date библиотеку, как это

ПУТЬ
int no_of_day_to_add = 1; 

Date today = new Date(); 
Date tomorrow = new Date(today.getYear(), today.getMonth(), today.getDate() + no_of_day_to_add); 

Изменить значение no_of_day_to_add, как вы хотите.

Я установил значение no_of_day_to_add в 1, потому что u хотел только один день, чтобы добавить.

Подробнее см. В this documentation.

2

Вы хотите, чтобы после дня находят этот код, попробуйте ..

public Date getToDateAfterDays(Integer day) { 
     Date nowdate = new Date(); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(nowdate); 
     cal.add(Calendar.DATE, day); 
     return cal.getTime(); 
    } 
1

Я покажу вам, как мы можем сделать это в Java 8. Здесь вы идете:

public class DemoDate { 
    public static void main(String[] args) { 
     LocalDate today = LocalDate.now(); 
     System.out.println("Current date: " + today); 

     //add 1 day to the current date 
     LocalDate date1Day = today.plus(1, ChronoUnit.DAYS); 
     System.out.println("Date After 1 day : " + date1Day); 
    } 
} 

Выход:

Current date: 2016-08-15 
Date After 1 day : 2016-08-16 
1

Java 8 Время API:

Instant now = Instant.now(); //current date 
Instant after= now.plus(Duration.ofDays(300)); 
Date dateAfter = Date.from(after); 
+0

Я думаю, что это Java 8 API – Jens

+0

Спасибо, конечно, исправить – GKislin

3

Я нашел простой метод, чтобы добавить произвольное время к объекту Date

Date d = new Date(new Date().getTime() + 86400000) 

Где:

86400000 составляет 1 день в миллисекундах

3600000 составляет 1 час в миллисекундах

Смежные вопросы