Java 달력을 사용하여 날짜부터 X 일을 빼는 방법은 무엇입니까?
-
03-07-2019 - |
문제
누구든지 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
. 원하는 경우 다른 방식으로 기능을 쉽게 변경할 수 있습니다.
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 );
에 대한 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 수업을 어디에서 얻을 수 있습니까?
- Java SE 8, Java SE 9, Java SE 10, 그리고 나중에
- 내장.
- 번들 구현이있는 표준 Java API의 일부.
- Java 9는 사소한 기능과 수정 사항을 추가합니다.
- Java SE 6 그리고 Java SE 7
- Java.Time 기능의 대부분은 Java 6 & 7으로 백 포트되어 있습니다. Threeten-Backport.
- 기계적 인조 인간
- Java.Time 클래스의 이후 버전의 Android 번들 구현.
- 이전 안드로이드 (<26)의 경우 threetenabp 프로젝트 적응 Threeten-Backport (위에 언급했듯이). 보다 Threetenabp를 사용하는 방법….
그만큼 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());