Вопрос по java – Как добавить один день к дате? [Дубликат]

187

This question already has an answer here:

How can I increment a date by one day in Java? 26 answers

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

<code>Date dt = new Date();
</code>

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

К вашему сведению: хлопотливый старыйjava.util.Date класс был вытесненjava.time.Instant класс с Java 8. Basil Bourque
Date.from (Instant.now (). PlusSeconds (86400)) dpk

Ваш Ответ

18   ответов
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();
    }
4

я предпочитаюJoda для арифметики даты и времени, потому что она намного лучше читается:

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

Или же

endOfDay(now().plus(days(1))).toDate()
startOfDay(now().plus(days(1))).toDate()
а производительность не важна? Если вы должны выполнять эти вычисления во многих случаях, это очень дорого. Читаемость - это одно, но об этом следует думать шире.
1

Ты можешь попробовать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 потому что ты хотел добавить только один день.

Больше можно найти вthis documentation.

2

Я покажу вам, как мы можем сделать это в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
9

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

DateUtils.addDays(new Date(), 1));
Избыточная правая скобка в конце.
4

Java 8 LocalDateAPI

LocalDate.now().plusDays(1L);

3

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

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

Я предупреждаю вас, что правильно настроить эти процедуры преобразования может быть сложно. Есть удивительное количество разных способов, которыми люди путают время, самым последним громким примером был MS Zune. Dont & APOS; Хотя ты слишком много шутишь с MS, это легко испортить. Не помогает то, что существует множество различных форматов времени, например, TAI против TT.

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);
60
Date today = new Date();
Date tomorrow = new Date(today.getTime() + (1000 * 60 * 60 * 24));

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

Важный совет: это не правильно во всех случаях. Прочитайте ПРЕДУПРЕЖДЕНИЕ комментарий ниже.

Понижающее голосование, так как это очень неправильный ответ, как из-за летнего времени, так и из-за високосных секунд. Используйте календарь или время Joda.
Вы правы. Я добавляю подсказку к этому комментарию к своему ответу.
ПРЕДУПРЕЖДЕНИЕ! Добавление 1000 * 60 * 60 * 24 миллисекунд к дате Java время от времени приведет к добавлению нуля или двух дней к исходной дате в условиях високосных секунд, перехода на летнее время и тому подобного. Если вам нужно быть на 100% уверенным, что добавлен только один день, это решение не подходит.
В этом контексте дополнительные секунды не являются проблемой, так как они игнорируются следующими библиотеками даты и времени: java.util.Date, Joda-Time и java.time. Реальная проблема с этим ответом - аномалии, такие как переход на летнее время, которые приводят к тому, что день не длится ровно 24 часа.
Я был бы осторожен, используя Date сегодня = new Date (); Дата завтра = новая Дата (today.getTime () + (1000 * 60 * 60 * 24)); Если вы используетеCalendar Timezone с учетом дневных сбережений, в день смены лета на зиму он не перейдет на следующий день.
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;
        }
    }
}
С точки зрения производительности, решение очень интересное. +1
Это не работает с високосными годами.
2

Java 1.8 version имеет приятное обновление для 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);

Output:

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

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

9

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

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

Куда:

86 400 000ms = 1 Day  : 24*60*60*1000
 3 600 000ms = 1 Hour :    60*60*1000
не справится с переходом на летнее время и т. д., но может быть достаточно хорош в крайнем случае :)
4

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

2

Java 8 Time API:

Instant now = Instant.now(); //current date
Instant after= now.plus(Duration.ofDays(300));
Date dateAfter = Date.from(after);
Спасибо, конечно, исправить
Я думаю, что это Java 8 API
3

Лучшая вещь для использования:

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

Точно так же вы можете добавить МЕСЯЦ, ДНИ, МИНУТЫ и т. Д.

12

tl;dr

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

java.time

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

Instant

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

Instant instant = myUtilDate.toInstant() ;

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

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

ZonedDateTime

Если вы хотите разбираться в часовых поясах, укажитеZoneId чтобы получитьZonedDateTime, Укажитеправильное название часового пояса в форматеcontinent/region, такие какAmerica/Montreal, Africa/Casablanca, или жеPacific/Auckland, Никогда не используйте 3-4 буквенное сокращение, такое какEST или жеIST как они естьnot настоящие часовые пояса, не стандартизированные и даже не уникальные (!).

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

Вы также можете представить свой промежуток времени, который будет добавлен, один день, какPeriod.

Period p = Period.ofDays( 1 ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ).plus( p ) ;

Вы можете хотеть первый момент этого следующего дня. Не думайте, что день начинается в 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что день может начаться в другое время, например, 01:00:00. Позволятьjava.time определить первый момент дня в этой дате в этой зоне.

LocalDate today = LocalDate.now( z ) ;
LocalDate tomorrow = today.plus( p ) ;
ZonedDateTime zdt = tomorrow.atStartOfDay( z ) ;

About java.time

java.time фреймворк встроен в Java 8 и выше. Эти классы вытесняют хлопотное староенаследие классы даты и времени, такие какjava.util.Date, Calendar& amp;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, а такжеБольше.


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

Joda-Time

Joda времени 2.3 библиотека значительно облегчает работу с датой и временем. Класс java.util.Date, связанный с Java, общеизвестно проблематичен, и его следует избегать.

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

Ваша java.util.Date конвертируется в Joda-TimeDateTime объект. В отличие от j.u.Date, DateTime действительно знает свой назначенный часовой пояс. Часовой пояс имеет решающее значение, так как добавление дня, чтобы получить тот женастенные часы завтра может означать внесение корректировок, например, для 23-часового или 25-часового дня в случаеЛетнее время (летнее время) здесь, в Соединенных Штатах. Если вы укажетечасовой пояс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();

Дамп на консоль & # x2026;

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

При запуске & # x2026;

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
@ Чарли & # x6728; & # x5320; ????
Просто прокомментируйте пару использования.
& GT Scala; java.time.LocalDate.now = & gt; res7: java.time.LocalDate = 2018-05-09 scala & gt; java.time.LocalDate.now.plusDays (2) = & gt; res9: java.time.LocalDate = 2018-05-11
428

УчитываяDate dt у вас есть несколько возможностей:

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

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

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

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

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

Date dt = new Date();
LocalDateTime.from(dt.toInstant()).plusDays(1);
@DerickDaniel Должно быть что-то не так с вашим окружающим кодом. Все три решения правильно переносятся по границам месяца / года. Убедитесь, что вы звонитеgetTime() на вашеCalendar экземпляр, а неget(...), Также обратите внимание, что месяцы от 0 до 11, а дни от 1 до 31.
Все решения поддерживают отрицательные смещения, даже с их отрицательными аналогами, поэтому вместоplusDays(1) можно также использоватьminusDays(-1).
@DanielRikowski Если я добавляю 1 день к последнему дню месяца в объекте календаря, месяц остается тем же самым вместо перехода к следующему месяцу, как заставить это работать?
Решение 3 не заканчивается датой .. оно заканчивается LocalDateTime
Для решения 1 (по крайней мере) вы также можете передать ему отрицательное значение (например, -1, чтобы получить накануне).
13

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

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

но иногда это может привести к появлению & lt;, code & gt; 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);

Похожие вопросы