187

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

This question already has an answer here:

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

Date dt = new Date();

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

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

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

    от
  • Избыточная правая скобка в конце.

    от
  • & 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

    от
  • С точки зрения производительности, решение очень интересное. +1

    от
  • Просто прокомментируйте пару использования.

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

    от
  • не справится с переходом на летнее время и т. д., но может быть достаточно хорош в крайнем случае :)

    от
  • @DerickDaniel Должно быть что-то не так с вашим окружающим кодом. Все три решения правильно переносятся по границам месяца / года. Убедитесь, что вы звонитеgetTime() на вашеCalendar экземпляр, а неget(...), Также обратите внимание, что месяцы от 0 до 11, а дни от 1 до 31.

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

    от
  • @DanielRikowski Если я добавляю 1 день к последнему дню месяца в объекте календаря, месяц остается тем же самым вместо перехода к следующему месяцу, как заставить это работать?

    от
  • @ Чарли & # x6728; & # x5320; ????

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

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

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

    от
  • Понижающее голосование, так как это очень неправильный ответ, как из-за летнего времени, так и из-за високосных секунд. Используйте календарь или время Joda.

    от
  • В этом контексте дополнительные секунды не являются проблемой, так как они игнорируются следующими библиотеками даты и времени: java.util.Date, Joda-Time и java.time. Реальная проблема с этим ответом - аномалии, такие как переход на летнее время, которые приводят к тому, что день не длится ровно 24 часа.

    от
  • Я был бы осторожен, используя Date сегодня = new Date (); Дата завтра = новая Дата (today.getTime () + (1000 * 60 * 60 * 24)); Если вы используетеCalendar Timezone с учетом дневных сбережений, в день смены лета на зиму он не перейдет на следующий день.

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

    от
  • ПРЕДУПРЕЖДЕНИЕ! Добавление 1000 * 60 * 60 * 24 миллисекунд к дате Java время от времени приведет к добавлению нуля или двух дней к исходной дате в условиях високосных секунд, перехода на летнее время и тому подобного. Если вам нужно быть на 100% уверенным, что добавлен только один день, это решение не подходит.

    от
  • Date.from (Instant.now (). PlusSeconds (86400))

    от dpk
  • К вашему сведению: хлопотливый старыйjava.util.Date класс был вытесненjava.time.Instant класс с Java 8.

    от Basil Bourque
18 ответов
  • 60

    Date имеет конструктор

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

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

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

  • 9

    Вы можете использовать этот метод после

    import org.apache.commons.lang.time.DateUtils:

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

  • 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);
    

  • 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);
    

  • 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
    

  • 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.

  • 4

    Java 8 LocalDate

    API

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

  • 2

    Java 8 Time API:

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

  • 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 к этим классам:

    LocalDate DateTimeFormatter

  • 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
    

  • 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);
    

  • 4

    я предпочитаю Date tomorrow = now().plusDays(1).toDate();

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

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

    Или же

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

  • 3

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

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

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

  • 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();
        }
    

  • 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;
            }
        }
    }
    

  • 4

    используйте объект DateTime obj.Add

    чтобы добавить то, что вы хотите, дневной час и т. д. Надеюсь, это работает :)

  • 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?

    Java SE 8, Java SE 9, Java SE 10, and later Built-in. Part of the standard Java API with a bundled implementation. Java 9 adds some minor features and fixes. Java SE 6 and Java SE 7 Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport. Android Later versions of Android bundle implementations of the java.time classes. For earlier Android (<26), the ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See How to use ThreeTenABP….

    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
    

  • 3

    Чтобы сделать его менее специфичным для java

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

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

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