않도록 java.util.Date & .Calendar는
accepted answer은 기술적으로 정확하지만, 최적의보다 적습니다. java.util.Date 및 .Calendar 클래스는 악명이 높습니다. 그들을 피하십시오. Joda-Time 또는 새 java.time package (Java 8)을 사용하십시오.
시간대
표준 시간대는 날짜/시간 작업에 중요합니다. 이 문제를 무시하면 JVM의 기본 시간대가 적용됩니다. 더 나은 방법은 기본값에 의존하는 대신 항상 지정하는 것입니다. 기본값을 원할 때도 명시 적으로 getDefault
을 호출하십시오.
하루의 시작은 시간대로 정의됩니다. 새로운 날은 몬트리올보다 베를린에서 일찍 일어납니다. 따라서 "오늘"과 "어제"의 정의에는 시간대가 필요합니다.
Joda-Time
Joda-Time 2.3의 예제 코드입니다.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Berlin");
DateTime today = DateTime.now(timeZone);
어제를 결정하는 한 가지 방법은 LocalDate 개체로 변환하는 것입니다. 여기에 표시된 또 다른 방법은 "어제"를 시간의 범위로 표현하는 것입니다. 이 스팬은 어제의 첫 순간부터 까지 진행되지만 오늘의 첫 번째 순간은이 아닙니다. 이 접근 방식은 시작이 이고 끝이 인 인 "반 개방"이라고합니다.
어제 (또는 그 전날)에 하루를 뺍니다.
DateTime yesterdayStartOfDay = today.minusDays(1).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval(yesterdayStartOfDay, today.withTimeAtStartOfDay());
대상 java.util.Date 객체를 Joda-Time DateTime 객체로 변환하십시오. JVM의 기본 시간대 적용에 의존하지 말고 해당 새 객체에 시간대를 적용하십시오. 이 경우 기술적으로 시간대는 적합하지 않지만 표준 시간대는 좋은 습관입니다.
DateTime target = new DateTime(myJUDate, timeZone);
대상이 어제 간격 내에 있는지 테스트합니다.
boolean isYesterday = yesterdayInterval.contains(target);
은 분명히 시간의 반 개방 스팬이 방법 등등 예 : "이번 주", "지난 달"로, "어제"단지보다 더와 함께 작동합니다.
업데이트 : Joda-Time 프로젝트는 현재 유지 관리 모드입니다. 팀은 java.time 클래스로의 마이그레이션을 권고합니다. correct Answer by Przemek에있는 java.time 솔루션을 참조하십시오.
1 월 1 일에이 기능이 작동하는 이유는 무엇입니까? 12 월 31 일의 연도가 달라지지 않습니까? – ebi
Calendar.add는 필드의 유형과 입력 된 금액으로 계산 된 오프셋으로 날짜의 타임 스탬프를 변경하기 때문에 작동합니다.따라서 원래 날짜와 상관없이 타임 스탬프 (1970 년 1 월 1 일 이후의 밀리 초) 만 사용하고 입력에 대해 계산 된 차이를 기준으로 새 날짜를 계산합니다. 필드가 DAY_OF_YEAR 인 경우에도 실제로이 연도가 변경됩니다. –
이 스레드를 보는 사람은 joda-time,'java.util.Date' 및'java.util.Calendar'보다 우선적으로 사용되어야하는'java.time'을 사용하는 @ Przemek의 대답을 참조해야합니다 : http : //stackoverflow.com/a/33893147/1322243 – liltitus27