Java에서 날짜를 하루 씩 늘리려면 어떻게해야합니까?


561

이 형식의 날짜로 작업하고 있습니다. yyyy-mm-dd .

이 날짜를 하루 씩 늘리려면 어떻게해야합니까?


10
Java 8 이상을 사용하는 경우 새로운 날짜 / 시간 API를 사용할 수 있습니다. 이 답변보기 : stackoverflow.com/a/23910924/1115554
micha

4
새로운 DateTime (). plusDays (1) .toDate () ???
Pietro

답변:


684

이와 같은 것이 트릭을 수행해야합니다.

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

50
@Esko, c.roll (Calendar.DATE, true)은 해당 월의 마지막 날에 월을 롤링하지 않습니다.
Sam Hasler

18
@Ammar 당신이 일을 이해하지 못하면 나쁜 생각입니다
niccolo m.

13
JavaDocs를 인용하겠습니다 ... Calendar.DATE : "... 이것은 DAY_OF_MONTH의 동의어입니다." JavaDocs가 이것이 더 큰 필드 (월 및 연도)를 증가시킬 것이라고 분명히하기를 바랍니다. Calendar.roll "더 큰 필드를 변경하지 않고 주어진 시간 필드에서 단일 시간 단위를 더하거나 빼기 (위 / 아래)".. "더 큰 필드"는 모호하지만 Sam의 설명과 일치하는 것 같습니다. 오래된 JavaDoc을 수정하기 위해 StackOverflow가 있었으면 좋겠습니다.
jcalfee314

4
불행히도 DATE, DAY_OF_MONTH 또는 DAY_OF_YEAR를 사용하여 일을 추가하는 것은 쓸모가 없습니다. 모두 계수로 증가합니다. 따라서 31-12-1970의 달력을 고려하면 add (DAY_OF_YEAR, 1) 또는 roll ()이지만 roll ()은 add ()를 호출하여 01-01-1970을 제공합니다. 유일한 올바른 방법은 밀리 초로 시간을 설정하는 것입니다. 나는 달력 클래스를 다시 사용하지 않습니다.
Dmitry Gryazin

14
@ Bagzerg : 잘못되었습니다 . add()날짜를 굴립니다. ideone을 참조하십시오 .
Jean Hominal

211

Java는 C #에 비해 8 공보다 훨씬 낫습니다. 이 유틸리티 메소드는 Calendar.add 메소드 (아마도 유일한 쉬운 방법)를 사용하여 Java SE 6에서 수행하는 방법을 보여줍니다 .

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

4
참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

79

java.time

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

3
참고로, 모두 ZonedDateDateTimeOffsetDateTime도 가지고 plusDaysminusDays방법뿐만 아니라LocalDate
바질 우르 큐

@BasilBourque 물론이지만 질문에 사용할 수있는 정보는의 정보 LocalDate입니다.
Daniel C. Sobral

2
@DanielCSobral p. 독자의 교육을위한 링크를 추가하기 만하면됩니다. 비판이 아닙니다.
Basil Bourque

65

Apache의 DateUtils 를 선호합니다 . http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html을 확인 하십시오 . 프로젝트에서 여러 위치를 사용해야 할 때 특히 유용하며이를 위해 하나의 라이너 방법을 작성하고 싶지 않습니다.

API는 말합니다 :

addDays (Date date, int amount) : 날짜에 새 객체를 반환하는 일 수를 추가합니다.

새 Date 객체를 반환하고 이전 객체 자체는 변경하지 않습니다.


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );

48

Calendar 객체를 구성하고 add (Calendar.DATE, 1) 메서드를 사용합니다.


43

Joda-Time ( https://www.joda.org/joda-time/ )을 살펴보십시오 .

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
DateTime을 구성하기위한 파서 호출을 제거 할 수 있습니다. 사용 DateTime 날짜 = new DateTime (dateString); 그런 다음 nextDay는 ISODateTimeFormat.date (). print (date.plusDays (1))입니다. 자세한 내용은 joda-time.sourceforge.net/api-release/org/joda/time/… 을 참조하십시오 .
MetroidFan2002

Joda-시간을 참조하여 자세한 예제 코드를 들어 내 대답 비슷한 질문을, 어떻게 날짜에 하루 추가? .
바질 부르 케

2
참고… Joda-Time 프로젝트는 현재 유지 보수 모드에 있으며 java.time 클래스 로의 마이그레이션을 권장 합니다. 두 사람의 노력은 같은 사람 Stephen Colebourne에 의해 주도되었습니다. 따라서 비슷한 개념을 공유하므로 마이그레이션이 어렵지 않습니다.
Basil Bourque

40

이 줄에는 24 시간이 추가됩니다.

d1.getTime() + 1 * 24 * 60 * 60 * 1000

하지만이 줄은 하루를 더합니다

cal.add( Calendar.DATE, 1 );

일광 절약 시간제 변경 (25 시간 또는 23 시간)이있는 날에는 다른 결과가 나타납니다!


40

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

1
난 당신이 januaryFirst.plusDays(1)아니었다 고 생각합니다 date.plusDays(1).
TeWu

이것은 안드로이드에서만 지원됩니다. developer.android.com/reference/java/time/package-summary.html
Subho

1
@Subho 26 이전의 Android의 경우 대부분의 Java 시간 기능이 Java 6 및 Java 7에 적용 되는 백 포트 인 ThreeTen- Backport 프로젝트를 조정 하는 ThreeTenABP 프로젝트를 참조하십시오 .
Basil Bourque

29

간단한 java.util lib를 사용할 수 있습니다

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();

1
이 답변 은 3 년 전에 접수 된 답변을 포함 하여 여러 답변의 내용을 복제합니다 . 답을 삭제하거나 값을 추가하려면 수정하십시오.
Basil Bourque 2016 년

3
이 답변은 깨끗하고 중간에 날짜를 구문 분석하지 않습니다. "허용 된 답변"이 너무 복잡합니다. 그것의 좋은 당신은, 무시 바질의 자동화 말을 당신을 추가
미키 Perlstein

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
바질 부르 케

바로 정답입니다. 나는 바질의 의견을 무시하고 미키에 동의합니다
eramirez75

23
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에서 다른 숫자로 변경할 수 있습니다.


1
추가하기 전에 c.setTime (Date object)과 같이 특정 날짜를 설정할 수 있습니다.
Linh Lino 2016 년

나는 기본 자바 패키지 날짜가 덜 뒤얽힌 처리 할 텐데 ... 나는 때마다 당신이 날짜를 처리 할 같은 통증 ... 그냥 호언 장담 ... 뜻
Shn_Android_Dev

1
@Shn_Android_Dev Java 8 이상에 내장 된 java.time 클래스는 끔찍한 오래된 날짜-시간 클래스를 대체하고 원하는대로 답변합니다. ThreeTen-BackportThreeTenABP 프로젝트 에서 Java 6/7 및 이전 Android로 백 포트되었습니다 . 필요가 이제까지 사용하지합니다 Date또는 Calendar다시.
Basil Bourque

19

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.
Basil Bourque

1
귀하의 답변은 최소한 네 개의 다른 답변의 내용을 반복합니다. 귀하의 가치가 그 이상의 가치를 부가하는 방법을 설명하거나, 투표를하기 전에 삭제하십시오.
Basil Bourque

16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

oldDate에서 획기적인 시간 (밀리 초)이 걸리고 1 일 분의 밀리 초를 추가 한 다음 Date () 공용 생성자를 사용하여 새 값을 사용하여 날짜를 만듭니다. 이 방법을 사용하면 하루 종일뿐만 아니라 1 일 또는 몇 시간 / 분을 추가 할 수 있습니다.


이것은 아마도 OP가 원하는 것이 아닐 것입니다. 일광 절약형 조정, 윤초 등을 허용하지 않습니다.
mrec

1
일광 절약 시간제는 시간대 / 지역에 따라 처리해야합니다. 내 예는 작은 기간으로 증가시키는 방법을 보여주었습니다. 일 단위로 늘리면 윤초가 문제가 될 수 있지만 시간을 추가 할 때 여전히 가능할 가능성은 적습니다.
dvaey 2014 년

15

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

그러면 질문에 날짜 만 묻는 날짜-시간 값이 생성됩니다. 훨씬 현명한 접근 방식은 LocalDateJava 8 이상에 대한 java.time 클래스의 클래스이며 ThreeTen-Backport 프로젝트 에서 Java 6 및 Java 7 로의 백 포트 입니다.
Basil Bourque


11

자바 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"));

11

간단한 단어로 설명하려고하는 것은 매우 간단합니다. 아래와 같이 오늘 날짜를 얻으십시오

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);

이제이 날짜로 일정을 앞당기 고 calendar.add 메소드 (일정한 값)로 설정하십시오. 여기서 상수는 DATE,시, 분, 초 등이 될 수 있으며 value는 상수의 값입니다. 하루 일정과 마찬가지로 상수는 Calendar.DATE이며 하루 값을 원하기 때문에 값은 1입니다.

System.out.println(calendar.getTime());// print modified date which is 내일 날짜

감사



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;

}

7

단일 시간 단위를 추가하고 다른 필드도 증가시킬 것으로 예상되는 경우 add 메소드를 안전하게 사용할 수 있습니다. 아래 예를 참조하십시오.

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

허용되는 답변이 없으며 다른 필드가 업데이트되면 전반적인 혼란이 있다고 생각했습니다.
terrmith

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
기부 해 주셔서 감사합니다. 그러나 이것은 이미 몇 가지 다른 해답에 있으므로, 아무 의미가 없습니다… 그 IMHO 외에도 Calendar2019
Ole VV

6

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 을 사용하는 것이 좋습니다.

Joda-Time은 Java 날짜 및 시간 클래스를 대체하는 품질을 제공하며 Java SE 8 이전의 Java에 대한 사실상 표준 날짜 및 시간 라이브러리입니다.

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

1
java.time부품 패턴 이 잘못되었습니다. 그것은해야 dd/MM/uuuuJodaTime 하나에 해당 될 수 있습니다.
TiiJ7

5

DateFormatAPI를 사용하여 문자열을 Date 객체로 변환 한 다음 CalendarAPI를 사용하여 하루를 추가하십시오. 특정 코드 예제를 원하면 알려 주시면 답변을 업데이트 할 수 있습니다.


3

당신은 자바 8을 사용하고있는 경우 java.time.LocalDatejava.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경우 월 동안 몇 분임을 기억하십시오 ).
Ole VV

3

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

5
Date2018 년 수업 제안 은 좋지 않은 조언입니다. 번거로운 구식 날짜 수업java.util.Date , java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 튜토리얼 오라클 . LocalDate클래스를 사용하는 다른 답변을 참조하십시오 .
Basil Bourque

그렇습니다. LocalDate는 가장 좋은 방법입니다.
Shaheed

그러나 jsf와 같은 일부 프레임 워크는 time API와 약간의 통합 문제가 있으므로 가끔 Date를 사용해야합니다. 플러스 환경 java <8
Lucke

1
@Lucke 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 & 7로 백 포트되었습니다 . ThreeTenABP 프로젝트 에서 이전 Android에 더 적합합니다 . 따라서 정말 피 묻은 끔찍한 옛날 데이트 수업을 만질 필요가 없습니다. 많은 프레임 워크가 업데이트되었습니다. 그러나 전부는 아닙니다. 따라서 아직 java.time으로 업데이트되지 않은 이전 코드와 상호 운용해야하는 경우 java.time 에 새 코드를 작성 하고 이전 클래스에 추가 된 새 변환 메소드를 호출하여 이전 유형으로 /에서 변환하십시오.
Basil Bourque

1
이 코드는 시간대중요한 문제를 무시합니다 . 주어진 순간마다 날짜는 지역별로 다릅니다. SimpleDateFormat클래스는 불행하게도 암시 적으로 JVM의 현재 기본 영역을 적용 시간대를 주입한다. 따라서이 코드의 결과는 현재 기본값에 따라 달라지며 런타임 중에 언제든지 기본값이 변경 될 수 있습니다 .
바질 부르 케

3

실제로 간단합니다. 하루에는 86400000 milliSeconds가 포함됩니다. 따라서 먼저 시스템 에서 밀리 초 단위로 현재 시간을 얻은 System.currentTimeMillis()다음 84000000 milliSeconds를 추가하고 Date클래스를 사용 하여 밀리 초의 날짜 형식을 생성하십시오.

String Today = new Date(System.currentTimeMillis()).toString();

오늘 문자열은 2019-05-9입니다.

String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();

String Tommorow는 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 )
Basil Bourque

2

유스 케이스를 명확히하자 : 달력 산술을하고 java.util.Date로 시작 / 끝내기를 원한다. .

일부 접근법 :

  1. SimpleDateFormat 을 사용하여 문자열로 변환하고 다시 변환 : 이것은 비효율적 인 솔루션입니다.
  2. LocalDate로 변환 : 시간 정보를 잃게됩니다.
  3. LocalDateTime으로 변환 : 더 많은 단계가 필요하므로 시간대에 대해 걱정할 필요가 있습니다.
  4. Date.getTime () 을 사용하여 에포크로 변환 : 이것은 효율적이지만 밀리 초로 계산합니다.

java.time.Instant 사용을 고려하십시오 .

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
Date현대의 java.time 클래스와 같은 끔찍한 레거시 클래스를 절대로 혼합하지 마십시오 Instant. java.time의 클래스는 완전히 기존의 클래스를 대신하다. 특히을 Instant대체합니다 java.util.Date.
바질 부르 케

1
질문을 다루지 않습니다. 순간을 나타내는 클래스 (오프셋 또는 영역과 관련하여 시간이있는 날짜)를 사용하고 있습니다. 그러나 질문은 시간대와 시간대가없는 날짜 만 묻습니다. Sobral의 정답 및 micha의 정답을 참조 하십시오 .
바질 부르 케

0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
fyi, Date.setDate ()는 사용되지 않습니다
Kelly S. French

내 컴퓨터에서는 한 달 동안 작동하는 것 같습니다. 후에 Sun Apr 30 16:25:33 CEST 2017온다 Mon May 01 16:25:33 CEST 2017. 그래도 여전히 낙담 한 해결책입니다. 이 방법은 좋은 이유로 사용되지 않을뿐만 아니라 2017 년에도 Date클래스 에 대한 대안이 매우 우수합니다 .
Ole VV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.