2010-06-09 5 views
33

는 지금은 getdateFromLine에 의해 반환 된 날짜() 어제 날짜인지 확인하기 위해 부드러운 방법이있을거야이 코드날짜 객체가 어제와 같은지 확인하는 방법은 무엇입니까?

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am" 
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))       //getDateFromLine() returns a Date Object that is always at 12pm 
{...CODE 

을 사용하고 있습니다. 시간 문제가 아니라 날짜 문제가 중요합니다. 그래서 SimpleDateFormat을 사용했습니다. 미리 도움을 주셔서 감사합니다.

답변

66
Calendar c1 = Calendar.getInstance(); // today 
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday 

Calendar c2 = Calendar.getInstance(); 
c2.setTime(getDateFromLine(line)); // your date 

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) 
    && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) { 

이것은 또한 월 1 일 같은 날짜에 대해 작동합니다.

+3

1 월 1 일에이 기능이 작동하는 이유는 무엇입니까? 12 월 31 일의 연도가 달라지지 않습니까? – ebi

+4

Calendar.add는 필드의 유형과 입력 된 금액으로 계산 된 오프셋으로 날짜의 타임 스탬프를 변경하기 때문에 작동합니다.따라서 원래 날짜와 상관없이 타임 스탬프 (1970 년 1 월 1 일 이후의 밀리 초) 만 사용하고 입력에 대해 계산 된 차이를 기준으로 새 날짜를 계산합니다. 필드가 DAY_OF_YEAR 인 경우에도 실제로이 연도가 변경됩니다. –

+1

이 스레드를 보는 사람은 joda-time,'java.util.Date' 및'java.util.Calendar'보다 우선적으로 사용되어야하는'java.time'을 사용하는 @ Przemek의 대답을 참조해야합니다 : http : //stackoverflow.com/a/33893147/1322243 – liltitus27

2

대신 달력이 시도 설정의 :

public static void main(String[] args) { 
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24; 
    Date date = new Date(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"); 
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS); 
    String currDate = dateFormat.format(date.getTime()); 
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS); 
    System.out.println("Previous date: " + prevDate); 
    System.out.println("Current date: " + currDate); 
    System.out.println("Next date: " + nextDate); 
    } 

이 당신이 prevDate 값으로 일정 그리고

당신은 단순히 getDateFromLine (라인)을 비교할 수를 따라 앞뒤로 이동할 수 있도록해야한다 또는 네가 좋아하는 것은 무엇이든.

1

나는 Joda-Time을 사용하는 것이 좋습니다. 그것은 JDK 제품보다 더 좋은 방법입니다. 이 대략 같은

0

뭔가 :

  Calendar c1 = Calendar.getInstance(); 
     Date d1 = new Date(/* control time */); 
     c1.setTime(d1); 

     //current date 
     Calendar c2 = Calendar.getInstance(); 

     int day1=c1.get(Calendar.DAY_OF_YEAR); 
     int day2=c2.get(Calendar.DAY_OF_YEAR); 

     //day2==day1+1 
+0

또한 연도 값도 비교해야합니다. –

+0

오, 그래, 나는 그 해를 잊어 버렸다. – Inv3r53

11

나는 당신의 온전함을 유지하기를 원한다면 Joda-Time 도서관이가는 길이라고 김 애쉬 씨에게 동의한다. 날짜 시간 day 어제에있는 경우,

이 예에서
import org.joda.time.DateTime; 

public static boolean dayIsYesterday(DateTime day) { 
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1); 
    DateTime inputDay = day.withTimeAtStartOfDay(); 

    return inputDay.isEqual(yesterday); 
} 

, 다음 dayIsYesterday(day)true를 반환합니다.

+0

Joda-Time의 자정 관련 클래스와 메소드는 결함있는 아이디어를 기반으로했습니다. Joda-Time 2.3에서는 더 이상 사용되지 않습니다. 대신 ['withTimeAtStartOfDay'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) 메소드를 사용하십시오. –

+0

또한 JVM의 기본값을 사용하는 것보다는 일반적으로 [표준 시간대 지정] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html)을 사용해야합니다. "오늘"과 "어제". –

+0

now = "1/07/2016" 이전 = "12/06/1980". 토요일 초보자가 날짜가 "어제"인지 확인하는 방법에 대해 질문하는 동안 previousFromYesteray는 true로 설정됩니다. – Dogcat

7

않도록 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 솔루션을 참조하십시오.

0

I는 1999년 12월 31일 인쇄

Calendar now = new GregorianCalendar(2000, 1, 1); 
now.add(Calendar.DATE, -1); 

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd"); 
System.out.println(format.format(now.getTime())); 

기대의 나이 방법을 테스트하려면이 방법을 사용하지만, 실제는 2001년 1월 31일 때 나는 조금 혼동을 발견했다 Calendar.add()는 월간 날짜 만 처리합니다.

하지만 실제 오류는 내가 캘린더 개체를 만드는 방법입니다. 캘린더에서 월이 으로 시작하고 변수의 값이 2001-2-1이므로 인쇄하지 않으려 고 자만심을 가졌습니다. 뭔가 잘못되었을 때 나타났습니다. 달력을 만들 수 올바른 방법은 다음과 같습니다

Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1); 

달력은 전직의 C# 프로그래머 :(

10

java.time

java.time 프레임 워크를 사용

LocalDate now = LocalDate.now(); //2015-11-24 
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23 

yesterday.equals(now); //false 
yesterday.equals(yesterday); //true 
자바 8에 내장에 너무 이상한

오라클 LocalDatetutorial

비교에는 equals 메서드를 사용해야합니다. 당신은 LocalDateTime, ZonedDateTime, 또는 OffsetDateTime 같은 개체로 작업하는 경우

, 당신은 LocalDate로 변환 할 수 있습니다.

LocalDateTime.now().toLocalDate(); # 2015-11-24 
+0

필자는 항상 ['ZoneId'] (http://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html)를 ['LocalDate.now'] (http : //docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#now-java.time.ZoneId-)를 사용하여 JVM의 현재 기본 시간대에 암시 적으로 의존하지 마십시오. 이 기본값은 런타임 중에도 언제든지 바뀔 수 있습니다. 이렇게 :'LocalDate.now (ZoneId.of ("America/Montreal"))'' –

관련 문제