문제

누구든지 Java Calendar를 사용하여 날짜부터 X 일을 빼기 위해 간단한 방법을 알고 있습니까?

Java의 날짜에서 X 일을 직접 빼낼 수있는 기능을 찾을 수 없었습니다. 누군가 나를 올바른 방향으로 가리킬 수 있습니까?

도움이 되었습니까?

해결책

가져 왔습니다 여기 문서:

달력 규칙에 따라 지정된 달력 필드에 지정된 시간을 추가하거나 빼냅니다. 예를 들어, 현재 달력의 현재 시간으로부터 5 일을 빼면 다음을 호출하여 달성 할 수 있습니다.

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

다른 팁

당신은 사용할 수 있습니다 add 방법 및 음수를 전달하십시오. 그러나 사용하지 않는 더 간단한 방법을 작성할 수도 있습니다. Calendar 다음과 같은 클래스

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

이것은 날짜의 타임 스탬프 값을 가져옵니다 (에포크 이후 밀리 초). 적절한 수의 밀리 초를 추가합니다. Days 매개 변수에 대한 부정적인 정수를 전달하여 빼기를 수행 할 수 있습니다. 이것은 "적절한"달력 솔루션보다 간단합니다.

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

이 두 솔루션 모두가 변경됩니다 Date 완전히 새로운 것을 반환하기보다는 매개 변수로 전달 된 객체 Date. 원하는 경우 다른 방식으로 기능을 쉽게 변경할 수 있습니다.

Anson의 대답 간단한 경우에는 잘 작동하지만 더 복잡한 날짜 계산을 수행하려면 체크 아웃하는 것이 좋습니다. 조다 시간. 그것은 당신의 삶을 훨씬 쉽게 만들 것입니다.

Joda 시간의 참고로 할 수 있습니다

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

tl; dr

LocalDate.now().minusDays( 10 )

시간대를 지정하는 것이 좋습니다.

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

세부

이전 날짜 시간 클래스는 다음과 같은 초기 버전의 Java와 함께 묶여 있습니다. java.util.Date/.Calendar, 번거롭고 혼란스럽고 결함이있는 것으로 판명되었습니다. 그들을 피하십시오.

Java.Time

Java 8 이상은 새로운 Java.Time 프레임 워크로 구식 수업을 대체합니다. 보다 지도 시간. 정의 JSR 310, 에서 영감을 받다 조다-시간, 그리고Threeten-extra 프로젝트. Threeten-Backport 프로젝트는 수업을 Java 6 & 7으로 백 포트합니다. Android에 대한 THREETENABP 프로젝트.

질문은 모호합니다. 날짜 전용 또는 날짜 시간을 요구하는지 명확하지 않습니다.

LocalDate

날짜 전용으로 시간없이 사용하십시오 LocalDate 수업. "오늘"과 같은 날짜를 결정하는 데 중요한 시간대입니다.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

날짜 시간을 의미한다면 사용하십시오 Instant 타임 라인에서 순간을 얻는 클래스 UTC. 거기에서 시간대로 조정하여 ZonedDateTime 물체.

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

Table of date-time types in Java, both modern and legacy.


에 대한 Java.Time

그만큼 Java.Time 프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 수업은 번거로운 오래된 것을 대체합니다 유산 다음과 같은 날짜 시간 수업 java.util.Date, Calendar, & SimpleDateFormat.

그만큼 조다-시간 지금 프로젝트 유지 관리 모드, Java.Time 클래스.

자세한 내용은 오라클 튜토리얼. 많은 예와 설명에 대한 검색 스택 오버 플로우. 사양입니다 JSR 310.

교환 할 수 있습니다 Java.Time 데이터베이스와 직접 개체. a JDBC 드라이버 준수합니다 JDBC 4.2 또는 나중에. 문자열이 필요없고 필요하지 않습니다 java.sql.* 클래스.

Java.Time 수업을 어디에서 얻을 수 있습니까?

그만큼 Threeten-extra 프로젝트는 추가 클래스로 Java.Time을 연장합니다. 이 프로젝트는 Java.Time에 향후 추가 할 수있는 근거입니다. 여기에서 유용한 수업을 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .

int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

편집 : 파서는 Javadoc에 대한 링크가 마음에 들지 않으므로 여기에는 일반 텍스트가 있습니다.

http://java.sun.com/j2se/1.4.2/docs/api/java/util/calendar.html#add(int, int)

내 자신을 쓰는 대신 addDays Eli가 제안한대로 사용하는 것이 좋습니다. DateUtils ~에서 아파치. 프로젝트에서 여러 장소를 사용해야 할 때 특히 편리합니다.

API는 말한다 :

addDays(Date date, int amount)

새 개체를 반환하는 날짜에 며칠을 추가합니다.

새로운 것을 반환합니다 Date 객체가 있고 이전 자체를 변경하지 않습니다.

누군가가 Joda Time을 추천 했으므로 - 나는 이것을 사용하고 있습니다. Calendardate 수업 http://calendardate.sourceforge.net

Joda Time과는 다소 경쟁하는 프로젝트이지만 2 개의 클래스에서는 훨씬 더 기본입니다. 프로젝트보다 더 큰 패키지를 사용하고 싶지 않았기 때문에 매우 편리하고 필요한 것에 큰 도움이되었습니다. Java 상대와는 달리, 가장 작은 단위는 날이므로 실제로 날짜가됩니다 (밀리 초 정도로 내려 가지 않음). 날짜를 만들면 빼기 위해 할 일은 MyDay.adddays (-5)와 같은 일입니다. 당신은 그것을 사용하여 요일과 그런 것들을 찾을 수 있습니다. 또 다른 예:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

그리고:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}

다음은 쉽게 수행 할 수 있습니다

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

Eli Courtwright second solution is wrong, it should be:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top